博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于TCP套接字实现的简单Demo
阅读量:7081 次
发布时间:2019-06-28

本文共 4778 字,大约阅读时间需要 15 分钟。

由于代码的注释已经很详尽了,所以这里不再作过多说明.仅仅贴出代码和结果图.

值得注意的是必须先启动server程序再启动client.

Server:

1 #include 
//套接字库 2 #include
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\n", 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("\nclient is closed!");70 71 sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);//重新开始监听72 printf("\nAccepte 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] = '\0';77 printf("\nReceived: %s\n", c_Message); 78 }79 return 0; 80 }
81

 

Client:

1 #include 
//套接字库 2 #include
3 4 #define SERVER_ADDRESS "127.0.0.1" //服务器端IP地址,由于服务也在本地机器上所以用环回地址127.0.0.1 5 6 #define PORT 6000 //客户端绑定端口 7 #define MSGSIZE 1024 //客户端接收数据缓冲区大小 8 #pragma comment(lib, "ws2_32.lib") 9 10 DWORD WINAPI FunThread(LPVOID); //对于客户端接收数据的线程函数 11 12 SOCKET sClient; //客户端套接字 13 SOCKADDR_IN server; //服务器端套接字14 15 16 int main()17 { 18 WSADATA wsaData; 19 char c_Message[MSGSIZE]; //数据缓冲区20 21 WSAStartup(0x0202, &wsaData); //初始化套接字库22 23 sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //创建客户端套接字24 25 memset(&server, 0, sizeof(SOCKADDR_IN)); //先将保存地址的server置为全026 server.sin_family = PF_INET; //声明地址格式是TCP/IP地址格式27 server.sin_port = htons(PORT); //指明连接服务器的端口号28 server.sin_addr.s_addr = inet_addr(SERVER_ADDRESS); //指明连接服务器的IP地址29 30 31 connect(sClient, (struct sockaddr *)&server, sizeof(SOCKADDR_IN)); //连到刚才指明的服务器上32 33 HANDLE hThread=CreateThread(NULL,0,FunThread,0,0,0);;//客户端开辟接收数据线程34 CloseHandle(hThread);35 36 //客户端向服务器发送数据37 while (TRUE)38 {39 printf("Client Send:");40 gets(c_Message); 41 42 send(sClient, c_Message, strlen(c_Message), 0); 43 if(!strcmp(c_Message,"exit"))//client自身退出44 exit(1);45 }46 47 // 释放连接和进行结束工作48 closesocket(sClient);49 WSACleanup();50 return 0;51 }52 53 //接收线程函数54 DWORD WINAPI FunThread(LPVOID)55 {56 char s_Message[MSGSIZE];//定义接收缓冲区57 int ret; 58 while (TRUE)59 {60 ret = recv(sClient, s_Message, MSGSIZE, 0);//接收服务器端的数据61 62 63 //判断是否接收64 if(ret==SOCKET_ERROR)65 {66 printf("\nServer is closed!\n");67 exit(1);68 }69 s_Message[ret] = '\0'; 70 //显示接收数据71 printf("\nReceived: %s\n", s_Message);72 73 //如果服务器端发送exit则client退出74 if(!strcmp(s_Message,"exit"))//server让client退出75 exit(1);76 }77 return 0;78 }
79

 

运行结果如下:

 

转载于:https://www.cnblogs.com/vpoet/p/4659744.html

你可能感兴趣的文章
C#进行Visio二次开发之电气线路停电分析逻辑
查看>>
简便无刷新文件上传系统
查看>>
[链接]实现GEF程序中的剪切/复制/粘贴功能
查看>>
lucene 的评分机制
查看>>
Backup Volume 操作 - 每天5分钟玩转 OpenStack(59)
查看>>
JavaWeb之tomcat安装、配置与使用(一)
查看>>
SpringMVC Controller 返回值的可选类型
查看>>
kbmmw 5.03 发布
查看>>
iOS - App 与外设间的通信方式
查看>>
13.7. Device Management
查看>>
144.2. tcpdump - A powerful tool for network monitoring and data acquisition
查看>>
查看ecshop广告位对应的广告详细信息
查看>>
Selenium2+python自动化51-unittest简介
查看>>
★路由递归查询方法及相关图示【转载】
查看>>
SAP 开源 SCA 工具,扫描软件包依赖漏洞
查看>>
在MATLAB下调试Caffe
查看>>
大图做帧动画卡顿?不存在的!—— 优化帧动画之SurfaceView 滑动窗口式帧复用...
查看>>
Android 8.0 新特性 之通知、自适应图标
查看>>
57 Insert Interval
查看>>
[译] 2018 PHP 应用程序安全设计指北
查看>>