任务目标

编写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模型通信程序的编写,编译和执行的更多相关文章

  1. 基于Select模型的Windows TCP服务端和客户端程序示例

    最近跟着刘远东老师的<C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台)>,Bilibili视频地址为C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台),重新复习下 ...

  2. 基于select模型的udp客户端实现超时机制

    参考:http://www.cnblogs.com/chenshuyi/p/3539949.html 多路选择I/O — select模型 其思想在于使用一个集合,该集合中包含需要进行读写的fd,通过 ...

  3. python 3下基于select模型的事件驱动机制程序

    它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程.它的流程如图: 当用户进程调用了select,那么整个 ...

  4. Python Select模型(程序流程)(转)

    缘由 之前写socket的CS模型代码,都是利用最原始的多线程方式.服务端是主线程,接到客户端的连接请求就从线程池中获取一个线程去处理整个socket连接的所有操作,虽然在连接数较短的情况下没有什么影 ...

  5. C语言 linux环境基于socket的简易即时通信程序

    转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html      ——By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易 ...

  6. 《HBase in Action》 第三章节的学习总结 ---- 如何编写和运行基于HBase的MapReduce程序

    HBase之所以与Hadoop是最好的伙伴,我理解就因为两点:1.HADOOP的HDFS,为HBase提供了分布式的存储方式:2.HADOOP的MR为HBase提供的分布式的计算方法.u 其中第一点, ...

  7. 使用Boost.Asio编写通信程序

    摘要:本文通过形像而活泼的语言简单地介绍了Boost::asio库的使用,作为asio的一个入门介绍是非常合适的,可以给人一种新鲜的感觉,同时也能让体验到asio的主要内容. Boost.Asio是一 ...

  8. 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 ...

  9. 基于WSAAsyncSelect模型的两台计算机之间的通信

    任务目标 编写Win32程序模拟实现基于WSAAsyncSelect模型的两台计算机之间的通信,要求编程实现服务器端与客户端之间双向数据传递.客户端向服务器端发送"请输出从1到1000内所有 ...

随机推荐

  1. [Android]apk反编译方法

    在学习Android开发的过程你,你往往会想去学习别人的apk是怎么开发的,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用的APK进行反编译查看.下面是我参考了一些 ...

  2. DEDE日期调用小插件

    在日期文本框里面,点击的时候,下面出来一个和万年历一样的日期选择表,在dede里面,有一个现成的js小插件,直接调用就OK了... <input type="text" on ...

  3. Java工具-检验ftp服务器的指定文件是否存在

    项目工作中,需要检验ftp服务器中指定文件是否存在,在网上查阅了相关资料,可以通过ftpClient类进行实现. import org.apache.commons.net.ftp.FTP; impo ...

  4. 解决浏览器窗口缩小出现白色背景的bug

    父容器上添加最小宽度min-width=xxxpx min-width的值大于浏览器横向滚动条出现时的宽度.

  5. 《ArcGIS Runtime SDK for Android开发笔记》——(9)、空间数据的容器-地图MapView

    1.前言 在上一篇内容里介绍了 关于ArcGIS Android开发的未来(“Quartz”版Beta)相关内容,期间也提到了关于API接口的重构,开发思路的调整,根据2015UC资料也可以知道新版预 ...

  6. centos7按报错dracut

    在Windows下,将从CentOS官网上下载的CentOS7镜像文件,用UltrISO以硬盘镜像方法写入U盘 安装过程中出现下面错误: dracut-initqueue[624]:Warning: ...

  7. C#队列Queue,利用队列处理订单

    一.什么是队列 队列(Queue)代表了一个先进先出的对象集合.当您需要对各项进行先进先出的访问时,则使用队列.当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队. 这是摘抄网上的.做了 ...

  8. MongoDB详解

    一.简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库 1.易用性 1)MongoDB是一款面向文档的数据库,而不是关系型数据库,因此而有着更好的扩展性. 2)通过在文档中嵌入文档和数组, ...

  9. 来自SaberSama的HTML总结

    html 为什么要转过来呢? 因为我觉到,同样是一个初学者,应该互相学习,交流. html:是Hyper Text Markup Language的简写,即超文本标记语言. 网页的组成成分为HTML- ...

  10. HTML5开发,背后的事情你知道吗?

    现在的H5越来越受到企业或者是开发者的一个大力的追捧,已经成为网络推广必不可少的一个使用的工具,相信还有很多朋友现在都不知道H5是个什么东西,本文将为大家讲的是关于H5一些分类的问题,让你进一步的去学 ...