由于代码的注释已经很详尽了,所以这里不再作过多说明.仅仅贴出代码和结果图.
值得注意的是必须先启动server程序再启动client.
Server:
1 #include <WINSOCK2.H> //套接字库 2 #include <stdio.h> 3 4 #define PORT 6000 //服务器端口 5 #define MSGSIZE 1024 //收发缓冲区的大小 6 7 #pragma comment(lib, "ws2_32.lib") //链接静态库 8 9 DWORD WINAPI FunThread(LPVOID); //创建一个线程,专门用来接收数据 10 11 SOCKET sClient; //连接所用套节字 12 SOCKET sListen; //监听套接字 13 SOCKADDR_IN client; //保存客户的地址信息 14 int iaddrSize = sizeof(SOCKADDR_IN); 15 16 int main() 17 { 18 19 WSADATA wsaData; //WSADATA结构体中主要包含了系统所支持的Winsock版本信息 20 SOCKADDR_IN local; //定义本地套接字地址 21 char s_Message[MSGSIZE]; //收发缓冲区 22 23 WSAStartup(0x0202, &wsaData); //初始化套接字库 24 25 sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器监听套节字。TCP协议 26 27 local.sin_family = AF_INET; //AF_INET指明使用TCP/IP协议族 28 local.sin_port = htons(PORT);//指明连接服务器的端口号 29 local.sin_addr.s_addr = htonl(INADDR_ANY);//自动获取本机地址 30 31 bind(sListen, (struct sockaddr *)&local, sizeof(SOCKADDR_IN));//地址绑定到套接字 32 33 listen(sListen, 1);//开始监听 34 35 sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);//建立连接,返回用于连接的套接字 36 printf("Accepte client:%s:%d ", inet_ntoa(client.sin_addr), ntohs(client.sin_port));//输出客户端的IP地址和端口 37 38 39 HANDLE hThread=CreateThread(NULL,0,FunThread,0,0,0);//运行至此创建专门的接收线程用于接收客户端发送 40 //的数据,在监听主线程上创建一个新的数据接收线程 41 CloseHandle(hThread);//关闭线程句柄 42 43 44 //用于从服务器端向客户端发送数据 45 while (TRUE) 46 { 47 printf("Server Send:"); 48 //从键盘输入 49 gets(s_Message); 50 //发送数据 51 send(sClient, s_Message, strlen(s_Message), 0); 52 } 53 return 0; 54 } 55 56 57 //当接收数据时调用此线程函数 58 DWORD WINAPI FunThread(LPVOID) 59 { 60 char c_Message[MSGSIZE]; //接收数据缓冲区 61 int ret; //接收字节的个数 62 while (TRUE) 63 { 64 ret = recv(sClient, c_Message, MSGSIZE, 0);//接收数据到缓冲区 65 66 //判断是否成功接收,如果未成功接收则重启监听,将原缓冲区的数据归零 67 if(ret==SOCKET_ERROR) 68 { 69 printf(" client is closed!"); 70 71 sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);//重新开始监听 72 printf(" Accepte new client:%s:%d", inet_ntoa(client.sin_addr), ntohs(client.sin_port)); 73 memset(c_Message,0,1024);//将原来的client message归零 74 continue; 75 } 76 c_Message[ret] = '