任务目标

编写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. Windows 编程

    在WndProc函数中 最好不要出现WM_SYSCOMMAND消息, 如果有了这个消息, 可能我们对创建出来的窗口就什么都管不了了, 因为我们阻碍了DefWndProc函数去处理它 不在.rc文件中添 ...

  2. HDU 5371——Hotaru's problem——————【manacher处理回文】

    Hotaru's problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  3. jquery日期插件jquery.datePicker参数

    1.效果图 2.引入JS.CSS文件 jquery-ui.min.css和jquery-ui.min.js文件 Includes: core.js, widget.js, mouse.js, posi ...

  4. $.ajax、$.post

    jQuery.post( url, [data], [callback], [type] ) :使用POST方式来进行异步请求 参数: url (String) : 发送请求的URL地址. data ...

  5. Socket网络通信之NIO

    Socket网络通信之NIO NIO:new io ,java1.4开始推出的可非阻塞IO. java.nio 包,可解决BIO阻塞的不足 但比BIO学习.使用复杂. 可以以阻塞.非阻塞两种方式工作. ...

  6. 反向代理总结-reverse-proxy-with-url-rewrite

    iis 反向代理 : 1. 微软文档 https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/reverse-proxy- ...

  7. iframe跨域上传图片

    方案一:用jquery的$.post异步提交,然后把返回来的值用jquery填充到隐藏域中.可是$.post不支持跨域. jQuery.ajax()支持get方式的跨域,这其实是采用jsonp的方式来 ...

  8. 树checkbox选择jquery实例

    <!DOCTYPE html> <html> <head> <title></title> <script src="htt ...

  9. Azure本月最新活动,速度Mark!

    桃花夭夭,渌水盈盈,就这样四月的脚步迫不及待地来了.为了帮助您能在第一时间了解 Azure 最新的活动,我们推出每月活动合集,你准备好了吗,一起来看吧! 立即访问http://market.azure ...

  10. ALPS语言学校(西雅图)|ALPS Language School (Seattle)

    http://www.swliuxue.com/school-3879.html 所属国家: 美国 所在省洲: 华盛顿州 所在城市: 华盛顿州 建校时间: 1992年 学校类型: 院校 学校类别: 私 ...