简单的学习代码,仅供参考:
server.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define SERVICE_PORT 8080
#define BUFSIZE 2048
#define HEAD 4
int main(int argc, char **argv)
{
struct sockaddr_in myaddr /* our address */
struct sockaddr_in remaddr /* remote address */
socklen_t addrlen = sizeof(remaddr) /* length of addresses */
int recvlen /* # bytes received */
int fd /* our socket */
int msgcnt = 0 /* count # of messages we received */
unsigned char buf[BUFSIZE]="ret_" /* receive buffer */
/* create a UDP socket */
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("cannot create socket\n")
return 0
}
/* bind the socket to any valid IP address and a specific port */
memset((char *)&myaddr, 0, sizeof(myaddr))
myaddr.sin_family = AF_INET
myaddr.sin_addr.s_addr = htonl(INADDR_ANY)
myaddr.sin_port = htons(SERVICE_PORT)
if (bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) {
perror("bind failed")
return 0
}
/* now loop, receiving data and printing what we received */
for ()
{
printf("waiting on port %d\n", SERVICE_PORT)
recvlen = recvfrom(fd, buf+HEAD, BUFSIZE, 0, (struct sockaddr *)&remaddr, &addrlen)
if (recvlen > 0)
{
buf[HEAD+recvlen] = 0
printf("received message: \"%s\" (%d bytes)\n", buf+HEAD, recvlen)
}
else
{
printf("uh oh - something went wrong!\n")
}
printf("sending response \"%s\"\n", buf)
if (sendto(fd, buf, strlen(buf), 0, (struct sockaddr *)&remaddr, addrlen) < 0)
{
perror("sendto")
}
}
close(fd)
return 0
}
client.c
#include <stdlib.h>#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#define SERVICE_PORT 8080
#define BUFLEN 2048
int main( int argc,char* argv[] )
{
struct sockaddr_in myaddr, remaddr
int fd, i, slen=sizeof(remaddr)
char sendbuf[BUFLEN]="hello" /* message buffer */
char readbuf[BUFLEN]={0}
int recvlen /* # bytes in acknowledgement message */
char *server = "127.0.0.1" /* change this to use a different server */
/* create a socket */
if ((fd=socket(AF_INET, SOCK_DGRAM, 0))==-1)
{
printf("socket created\n")
}
/* bind it to all local addresses and pick any port number */
memset((char *)&myaddr, 0, sizeof(myaddr))
myaddr.sin_family = AF_INET
myaddr.sin_addr.s_addr = htonl(INADDR_ANY)
myaddr.sin_port = htons(0)
if (bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0)
{
perror("bind failed")
return 0
}
memset((char *) &remaddr, 0, sizeof(remaddr))
remaddr.sin_family = AF_INET
remaddr.sin_port = htons(SERVICE_PORT)
if (inet_aton(server, &remaddr.sin_addr)==0)
{
fprintf(stderr, "inet_aton() failed\n")
exit(1)
}
printf("Sending packet %d to %s port %d\n", i, server, SERVICE_PORT)
if (sendto(fd, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&remaddr, slen)==-1)
{
perror("sendto")
exit(1)
}
/* now receive an acknowledgement from the server */
recvlen = recvfrom(fd, readbuf, BUFLEN, 0, (struct sockaddr *)&remaddr, &slen)
if ( recvlen >= 0 )
{
readbuf[recvlen] = 0 /* expect a printable string - terminate it */
printf("received message: \"%s\"\n", readbuf)
}
close(fd)
return 0
}
如果需要整个工程,可以联系我。
需要用到的头文件包含:
#include <winsock2.h>
#include <windows.h>
与Linux环境下socket编程相比,windows环境多了一个步骤:启动或者初始化winsock库
Winsock,一种标准API,一种网络编程接口,用于两个或多个应用程序(或进程)之间通过网络进行数据通信。具有两个版本:
Winsock 1:
Windows CE平台支持。
头文件:WinSock.h
库:wsock32.lib
Winsock 2:
部分平台如Windows CE貌似不支持。通过前缀WSA可以区别于Winsock 1版本。个别函数如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都属于Winsock 1.1规范的函数;
头文件:WinSock2.h
库:ws2_32.lib
mswsock.h用于编程扩展,使用时必须链接mswsock.dll
扩展资料
winsock库的加载与卸载:
加载:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData)
加载成功,返回值为0。
WORD wVersionRequested:加载的winsock版本,使用宏MAKEWORD(x, y),x表示高字节,y表示低字节。然而使用时MAKEWORD(2, 2)。高字节与低字节相同~~
LPWSADATA lpWSAData:WSADATA结构的指针,传入参数后,系统帮助我们填充版本信息。有兴趣的可以看看结构体内容,不过基本用不着。
卸载:int WSACleanup(void)比起加载,卸载的函数真是轻松愉快。
Windows下C语言的Socket编程例子(TCP和UDP)一。 <TCP>
server端:
复制代码
1 #include "stdafx.h"
2 #include <stdio.h>
3 #include <winsock2.h>
4
5 #pragma comment(lib,"ws2_32.lib")
6
7 int main(int argc, char* argv[])
8 {
9 //初始化WSA
10 WORD sockVersion = MAKEWORD(2,2)
11 WSADATA wsaData
12 if(WSAStartup(sockVersion, &wsaData)!=0)
13 {
14 return 0
15 }
16
17 //创建套接字
18 SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
19 if(slisten == INVALID_SOCKET)
20 {
21 printf("socket error !")
22 return 0
23 }
24
25 //绑定IP和端口
26 sockaddr_in sin
27 sin.sin_family = AF_INET
28 sin.sin_port = htons(8888)
29 sin.sin_addr.S_un.S_addr = INADDR_ANY
30 if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
31 {
32 printf("bind error !")
33 }
34
35 //开始监听
36 if(listen(slisten, 5) == SOCKET_ERROR)
37 {
38 printf("listen error !")
39 return 0
40 }
41
42 //循环接收数据
43 SOCKET sClient
44 sockaddr_in remoteAddr
45 int nAddrlen = sizeof(remoteAddr)
46 char revData[255]
47 while (true)
48 {
49 printf("等待连接...\n")
50 sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen)
51 if(sClient == INVALID_SOCKET)
52 {
53 printf("accept error !")
54 continue
55 }
56 printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr))
57
58 //接收数据
59 int ret = recv(sClient, revData, 255, 0)
60 if(ret > 0)
61 {
62 revData[ret] = 0x00
63 printf(revData)
64 }
65
66 //发送数据
67 char * sendData = "你好,TCP客户端!\n"
68 send(sClient, sendData, strlen(sendData), 0)
69 closesocket(sClient)
70 }
71
72 closesocket(slisten)
73 WSACleanup()
74 return 0
75 }
复制代码
client端:
复制代码
1 #include "stdafx.h"
2 #include <WINSOCK2.H>
3 #include <STDIO.H>
4
5 #pragma comment(lib,"ws2_32.lib")
6
7
8 int main(int argc, char* argv[])
9 {
10 WORD sockVersion = MAKEWORD(2,2)
11 WSADATA data
12 if(WSAStartup(sockVersion, &data) != 0)
13 {
14 return 0
15 }
16
17 SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
18 if(sclient == INVALID_SOCKET)
19 {
20 printf("invalid socket !")
21 return 0
22 }
23
24 sockaddr_in serAddr
25 serAddr.sin_family = AF_INET
26 serAddr.sin_port = htons(8888)
27 serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1")
28 if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
29 {
30 printf("connect error !")
31 closesocket(sclient)
32 return 0
33 }
34 char * sendData = "你好,TCP服务端,我是客户端!\n"
35 send(sclient, sendData, strlen(sendData), 0)
36
37 char recData[255]
38 int ret = recv(sclient, recData, 255, 0)
39 if(ret > 0)
40 {
41 recData[ret] = 0x00
42 printf(recData)
43 }
44 closesocket(sclient)
45 WSACleanup()
46 return 0
47 }
复制代码
二. <UDP>
SERVER 端
复制代码
1 #include "stdafx.h"
2 #include <stdio.h>
3 #include <winsock2.h>
4
5 #pragma comment(lib, "ws2_32.lib")
6
7 int main(int argc, char* argv[])
8 {
9 WSADATA wsaData
10 WORD sockVersion = MAKEWORD(2,2)
11 if(WSAStartup(sockVersion, &wsaData) != 0)
12 {
13 return 0
14 }
15
16 SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
17 if(serSocket == INVALID_SOCKET)
18 {
19 printf("socket error !")
20 return 0
21 }
22
23 sockaddr_in serAddr
24 serAddr.sin_family = AF_INET
25 serAddr.sin_port = htons(8888)
26 serAddr.sin_addr.S_un.S_addr = INADDR_ANY
27 if(bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
28 {
29 printf("bind error !")
30 closesocket(serSocket)
31 return 0
32 }
33
34 sockaddr_in remoteAddr
35 int nAddrLen = sizeof(remoteAddr)
36 while (true)
37 {
38 char recvData[255]
39 int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr *)&remoteAddr, &nAddrLen)
40 if (ret > 0)
41 {
42 recvData[ret] = 0x00
43 printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr))
44 printf(recvData)
45 }
46
47 char * sendData = "一个来自服务端的UDP数据包\n"
48 sendto(serSocket, sendData, strlen(sendData), 0, (sockaddr *)&remoteAddr, nAddrLen)
49
50 }
51 closesocket(serSocket)
52 WSACleanup()
53 return 0
54 }
复制代码
CLIENT 端
复制代码
1 #include "stdafx.h"
2 #include <stdio.h>
3 #include <winsock2.h>
4
5 #pragma comment(lib, "ws2_32.lib")
6
7 int main(int argc, char* argv[])
8 {
9 WORD socketVersion = MAKEWORD(2,2)
10 WSADATA wsaData
11 if(WSAStartup(socketVersion, &wsaData) != 0)
12 {
13 return 0
14 }
15 SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
16
17 sockaddr_in sin
18 sin.sin_family = AF_INET
19 sin.sin_port = htons(8888)
20 sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1")
21 int len = sizeof(sin)
22
23 char * sendData = "来自客户端的数据包.\n"
24 sendto(sclient, sendData, strlen(sendData), 0, (sockaddr *)&sin, len)
25
26 char recvData[255]
27 int ret = recvfrom(sclient, recvData, 255, 0, (sockaddr *)&sin, &len)
28 if(ret > 0)
29 {
30 recvData[ret] = 0x00
31 printf(recvData)
32 }
33
34 closesocket(sclient)
35 WSACleanup()
36 return 0
37 }