ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

套接字编程

2021-12-11 16:00:27  阅读:175  来源: 互联网

标签:return ser 编程 printf 接字 buf Winsock SOCKET


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

 

标签:return,ser,编程,printf,接字,buf,Winsock,SOCKET
来源: https://www.cnblogs.com/hanselhuang/p/socket.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有