(1)服务器端代码
1 #include <stdio.h> 2 // Winsock是一个基于Socket模型的API 3 #include <winsock2.h> 4 5 // 要包含头文件 Winsock2.h,就需要调用库 ws2_32.lib 6 #pragma comment( lib, "ws2_32.lib" ) 7 8 9 10 /* Winsock启动测试,检查系统协议栈安装情况 */ 11 void TestWinsockStartup(); 12 13 14 15 int main( int argc, char* argv[] ) { 16 // 0. Winsock启动测试 17 TestWinsockStartup(); 18 19 20 SOCKET sListen, sAccept; 21 // 客户端地址长度、发送数据长度 22 int iLen, iSend; 23 // 要发送给客户的信息 24 char buf[] = "Hello World! from NCHU!"; 25 // 服务器和客户的地址 26 struct sockaddr_in ser, cli; 27 // 初始化客户地址长度 28 iLen = sizeof(cli); 29 30 // 1. 创建服务器端通信套接字 31 sListen = socket( AF_INET, SOCK_STREAM, 0 ); 32 if( sListen == INVALID_SOCKET ) { 33 printf("socket() Failed: %d\n", WSAGetLastError()); 34 return -1; 35 } 36 37 // 2. 将创建的套接字与服务器地址进行绑定 38 ser.sin_family = AF_INET; 39 ser.sin_port = htons( 5050 ); // 端口号 5050 40 ser.sin_addr.s_addr = htonl( INADDR_ANY ); 41 if( bind(sListen, (LPSOCKADDR)&ser, sizeof(ser)) == SOCKET_ERROR ){ 42 printf("bind() Failed: %d\n", WSAGetLastError()); 43 return -1; 44 } 45 46 // 3. 进入监听状态 47 if( listen(sListen, 5) == SOCKET_ERROR ) { 48 printf("lisiten() Failed: %d\n", WSAGetLastError()); 49 return -1; 50 } 51 52 // 4. 进入一个无限循环,等待客户的连接请求 53 while(1) { 54 // 4.1 接收来自客户端由 connect()发出的连接请求 55 sAccept = accept( sListen, (struct sockaddr *)&cli, &iLen ); 56 if( sAccept == INVALID_SOCKET ) { 57 printf("accept() Failed: %d\n", WSAGetLastError()); 58 return -1; 59 } 60 // 输出客户 IP地址和端口号 61 printf("Accepted client IP:[%s], port:[%d]\n", inet_ntoa(cli.sin_addr), ntohs(cli.sin_port)); 62 63 // 4.2 给连接的客户发送信息 64 iSend = send( sAccept, buf, sizeof(buf), 0 ); 65 if( iSend == SOCKET_ERROR ) { 66 printf("send() Failed: %d\n", WSAGetLastError()); 67 break; 68 } else if(iSend == 0) { 69 break; 70 } else { 71 // 成功发送数据 72 printf("send() byte: %d\n", iSend); 73 } 74 closesocket(sAccept); 75 } 76 77 closesocket(sListen); 78 WSACleanup(); 79 return 0; 80 } 81 82 83 84 /* Winsock启动测试,检查系统协议栈安装情况 */ 85 void TestWinsockStartup() { 86 WORD wVersionRequested; 87 WSADATA wsaData; 88 wVersionRequested = MAKEWORD(2, 2); 89 90 if( WSAStartup(wVersionRequested, &wsaData) != 0 ) { 91 printf("Winsock初始化错误!\n"); 92 return ; 93 } 94 if( wsaData.wVersion != wVersionRequested ) { 95 printf("Winsock版本不匹配!\n"); 96 WSACleanup(); 97 return ; 98 } 99 printf("WinsockDLL正确加载!\n"); 100 }
(2)客户端代码
1 #include <stdio.h> 2 // Winsock是一个基于Socket模型的API 3 #include <winsock2.h> 4 5 // 要包含头文件 Winsock2.h,就需要调用库 ws2_32.lib 6 #pragma comment( lib, "ws2_32.lib" ) 7 8 9 10 /* Winsock启动测试,检查系统协议栈安装情况 */ 11 void TestWinsockStartup(); 12 13 14 15 int main( int argc, char* argv[] ) { 16 // 0. Winsock启动测试 17 TestWinsockStartup(); 18 19 SOCKET sClient; 20 // 从服务器端接收的数据长度 21 int iLen; 22 // 接收数据的缓冲区 23 char buf[1024]; 24 //接收缓冲区初始化 25 memset( buf, 0, sizeof(buf) ); 26 // 服务器端地址 27 struct sockaddr_in ser; 28 29 // 命令行参数输入是否正确:client [Server IP] 30 if( argc < 2 ) { 31 //提示在命令行中输入服务器 IP地址 32 printf("Usage: client [server IP address]\n"); 33 return -1; 34 } 35 36 // 1. 填写要连接的服务器地址信息 37 ser.sin_family = AF_INET; 38 ser.sin_port = htons( 5050 ); 39 // 将命令行中输入的点分 IP地址转换为二进制表示的网络字节序 IP地址 40 ser.sin_addr.s_addr = inet_addr( argv[1] ); 41 42 // 2. 建立客户端流式套接字 43 sClient = socket( AF_INET,SOCK_STREAM, 0 ); 44 if( sClient == INVALID_SOCKET ) { 45 printf("socket() Failed: %d\n", WSAGetLastError()); 46 return -1; 47 } 48 49 // 3. 请求与服务器端建立 TCP连接 50 if( connect(sClient, (struct sockaddr *)&ser, sizeof(ser)) == INVALID_SOCKET ) { 51 printf("connect() Failed: %d\n", WSAGetLastError()); 52 return -1; 53 } else { 54 // 从服务器端接收数据 55 iLen = recv( sClient, buf, sizeof(buf), 0 ); 56 if( iLen == 0 ) { 57 return -1; 58 } else if( iLen == SOCKET_ERROR ) { 59 printf("recv() Failed: %d\n", WSAGetLastError()); 60 return -1; 61 } else { 62 // 输出接收到的数据 63 printf("recv() data from server: %s\n", buf); 64 } 65 } 66 67 closesocket(sClient); 68 WSACleanup(); 69 return 0; 70 } 71 72 73 74 /* Winsock启动测试,检查系统协议栈安装情况 */ 75 void TestWinsockStartup() { 76 WORD wVersionRequested; 77 WSADATA wsaData; 78 wVersionRequested = MAKEWORD(2, 2); 79 80 if( WSAStartup(wVersionRequested, &wsaData) != 0 ) { 81 printf("Winsock初始化错误!\n"); 82 return ; 83 } 84 if( wsaData.wVersion != wVersionRequested ) { 85 printf("Winsock版本不匹配!\n"); 86 WSACleanup(); 87 return ; 88 } 89 printf("WinsockDLL正确加载!\n"); 90 }