基于Select模型通信程序的编写,编译和执行
任务目标
编写Win32程序模拟实现基于Select模型的两台计算机之间的通信,要求编程实现服务器端与客户端之间双向数据传递。客户端向服务器端发送“计算从1到100的奇数和”,服务器回应客户端并给出从1到100的奇数和结果。
核心代码
Server:
1. #include "InitSock.h"
2. #include <stdio.h>
3. #include <string.h>
4. #include <stdlib.h>
5. CInitSock initSock;
6. int main(int argc, char* argv[])
7. {
8. //创建套接字
9. SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
10. if(sListen == INVALID_SOCKET)
11. {
12. printf("socket error !");
13. return 0;
14. }
15.
16. //绑定IP和端口
17. sockaddr_in sin;
18. sin.sin_family = AF_INET;
19. sin.sin_port = htons(5555);
20. sin.sin_addr.S_un.S_addr = INADDR_ANY;
21. if(bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
22. {
23. printf("bind error !");
24. }
25. ::listen(sListen, 5);
26.
27. int itotal=0;
28. int ii;
29. for(ii=1;ii<=100;ii++)
30. {
31. if(ii % 2 ==1)
32. {
33. itotal+=ii;
34. }
35. }
36.
37. fd_set fdSocket;
38. FD_ZERO(&fdSocket);
39. FD_SET(sListen, &fdSocket);
40. while(true) {
41. fd_set fdRead = fdSocket;
42. int nRet = ::select(0, &fdRead, NULL, NULL, NULL);
43. if(nRet > 0) {
44. for(int i=0; i<(int)fdSocket.fd_count; i++) {
45. if(FD_ISSET(fdSocket.fd_array[i], &fdRead)) {
46. if(fdSocket.fd_array[i] == sListen) {
47. if(fdSocket.fd_count < FD_SETSIZE) {
48. sockaddr_in addrRemote;
49. int nAddrLen = sizeof(addrRemote);
50. SOCKET sNew = ::accept(sListen, (SOCKADDR*)&addrRemote, &nAddrLen);
51. FD_SET(sNew, &fdSocket);
52. printf("接收到连接(%s)\n", ::inet_ntoa(addrRemote.sin_addr));
53. }
54. else {
55. printf("连接数量过多!\n");
56. continue;
57. }
58. }
59. else {
60. //接收数据
61. char szText[256];
62. int nRecv = ::recv(fdSocket.fd_array[i], szText, strlen(szText), 0);
63. if(nRecv > 0) {
64. szText[nRecv] = '\0';
65. printf("接收到数据:%s\n", szText);
66.
67. //发送数据
68.
69. char str[10];
70. char str1[20]="1到100的奇数和为:";
71. itoa(itotal,str,10);
72. char * sendData = strcat(str1,str);
73. ::send(fdSocket.fd_array[i], sendData, strlen(sendData), 0);
74.
75.
76. }
77. else {
78. ::closesocket(fdSocket.fd_array[i]);
79. FD_CLR(fdSocket.fd_array[i], &fdSocket);
80. }
81. }
82. }
83. }
84.
85.
86. }
87. else {
88. printf("选择失败!\n");
89. break;
90. }
91. }
92. return 0;
93. }
94.
95.
Client:
1. #include "winsock2.h"
2. #include <iostream>
3. #pragma comment(lib, "ws2_32.lib")
4. using namespace std;
5. BOOL RecvLine(SOCKET s, char* buf); //读取一行数据
6. int main(int argc, char* argv[])
7. {
8. const int BUF_SIZE = 64;
9. WSADATA wsd; //WSADATA变量
10. SOCKET sHost; //服务器套接字
11. SOCKADDR_IN servAddr; //服务器地址
12. char buf[BUF_SIZE]; //接收数据缓冲区
13. char bufRecv[BUF_SIZE];
14. int retVal; //返回值
15. //WSAStartup()初始化套结字动态库
16. if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
17. {
18. cout << "WSAStartup failed!" << endl;
19. return -1;
20. }
21. //socket()创建套接字
22. sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
23. if(INVALID_SOCKET == sHost)
24. {
25. cout << "socket failed!" << endl;
26. WSACleanup();//释放套接字资源
27. return -1;
28. }
29. //设置服务器地址
30. servAddr.sin_family =AF_INET;
31. servAddr.sin_addr.s_addr = inet_addr("172.21.0.140"); servAddr.sin_port = htons((short)5555);
32. int nServAddlen = sizeof(servAddr);
33. //connet()连接服务器
34. retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr));
35. if(SOCKET_ERROR == retVal)
36. {
37. cout << "connect failed!" << endl;
38. closesocket(sHost); //关闭套接字
39. WSACleanup(); //释放套接字资源
40. return -1;
41. }
42. int FLAG = 1;
43. //while(true)
44. while(FLAG)
45. {
46. //send()向服务器发送数据
47. ZeroMemory(buf, BUF_SIZE);
48. char sendM[] = "计算从1到100的奇数和";
49. retVal = send(sHost, sendM, strlen(sendM), 0);
50. if (SOCKET_ERROR == retVal)
51. {
52. cout << "send failed!" << endl;
53. closesocket(sHost); //关闭套接字
54. WSACleanup(); //释放套接字资源
55. return -1;
56. }
57. //Recv()接收服务器端的数据
58. ZeroMemory(bufRecv, BUF_SIZE);
59. recv(sHost, bufRecv,BUF_SIZE , 0); // 接收服务器端的数据,只接收5个字符cout << endl <<"从服务器接收数据:"<<endl<< bufRecv;
60. cout << endl <<"从服务器接收数据:"<<endl<< bufRecv;
61. cout<<endl;
62. FLAG=0;
63. }
64. closesocket(sHost); //关闭套接字
65. WSACleanup(); //释放套接字资源
66. return 0;
67. }
68.
基于Select模型通信程序的编写,编译和执行的更多相关文章
- 基于Select模型的Windows TCP服务端和客户端程序示例
最近跟着刘远东老师的<C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台)>,Bilibili视频地址为C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台),重新复习下 ...
- 基于select模型的udp客户端实现超时机制
参考:http://www.cnblogs.com/chenshuyi/p/3539949.html 多路选择I/O — select模型 其思想在于使用一个集合,该集合中包含需要进行读写的fd,通过 ...
- python 3下基于select模型的事件驱动机制程序
它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程.它的流程如图: 当用户进程调用了select,那么整个 ...
- Python Select模型(程序流程)(转)
缘由 之前写socket的CS模型代码,都是利用最原始的多线程方式.服务端是主线程,接到客户端的连接请求就从线程池中获取一个线程去处理整个socket连接的所有操作,虽然在连接数较短的情况下没有什么影 ...
- C语言 linux环境基于socket的简易即时通信程序
转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html ——By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易 ...
- 《HBase in Action》 第三章节的学习总结 ---- 如何编写和运行基于HBase的MapReduce程序
HBase之所以与Hadoop是最好的伙伴,我理解就因为两点:1.HADOOP的HDFS,为HBase提供了分布式的存储方式:2.HADOOP的MR为HBase提供的分布式的计算方法.u 其中第一点, ...
- 使用Boost.Asio编写通信程序
摘要:本文通过形像而活泼的语言简单地介绍了Boost::asio库的使用,作为asio的一个入门介绍是非常合适的,可以给人一种新鲜的感觉,同时也能让体验到asio的主要内容. Boost.Asio是一 ...
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
C#中缓存的使用 缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可: <%@ Outp ...
- 基于WSAAsyncSelect模型的两台计算机之间的通信
任务目标 编写Win32程序模拟实现基于WSAAsyncSelect模型的两台计算机之间的通信,要求编程实现服务器端与客户端之间双向数据传递.客户端向服务器端发送"请输出从1到1000内所有 ...
随机推荐
- Ubuntu瞎胡搞
ubutnu的几个必不可少的软件: 1.Guake,超级方便的终端 2.Unity tweak tool 3.VLC,本地视频播放器 4.MyPint,简单画图软件 5.GIMP,PS工具 Subli ...
- Linux Shell 录制并回放终端会话
当别人演示某些命令时,一时可能记不住,解决办法之一是把演示时的过程录制下来,视频当然最完美但是成本高.利用script和scriptrelay命令可以录制命令的次序和时序. 录制 script -t ...
- JS获取前一个页面
document.referrer 可以得到上一个点击超连接进来的页面URL注意:只能访问服务器上页面使用,打开本地文件无效(为空字符串)
- idea安装激活
安装激活链接: https://blog.csdn.net/newabcc/article/details/80601933 激活出错链接:(key is invalid 失效) https://bl ...
- hdu 1561 树形DP n个选m个价值最大
http://acm.hust.edu.cn/vjudge/problem/18068 #include <iostream> #include <string> #inclu ...
- Python:Tkinter的GUI设计——物体实时移动
参考: 1.Tkinter之Canvas篇 2.python GUI实践:做一个满图乱跑的小球 3.[Tkinter 教程08] Canvas 图形绘制 4.tkinter模块常用参数(python3 ...
- Window10 Bug记录
1.两台新电脑刚安装: 妹子的电脑JDK配置后,重启后环境变量配置丢失,cmd里能输出,但eclipse启动不了,重新配置后正常. 我的电脑JDK配置,重启后环境变量在,但好像没加载,cmd输出与ec ...
- Can't connect to any repository.Read timed out after 30,000 ms
解决方法:
- webpack前端构建工具学习总结(一)之webpack安装、创建项目
npm是随nodeJs安装包一起安装的包管理工具,能解决NodeJS代码部署上的很多问题: 常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器 ...
- April 14 2017 Week 15 Friday
Try to be a rainbow in someone's cloud. 当乌云萦绕心头,我愿意成为你的彩虹. Actually there are many rainbows in our l ...