套接字编程

(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 }

 

上一篇:DRF简单复习


下一篇:1-5.视图组件