任务目标

编写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. The function getUserId must be used with a prefix when a default namespace is not specified 解决办法

    The function getUserId must be used with a prefix when a default namespace is not specified 解决方法: 1. ...

  2. Myeclipse修改jdk版本流程

    Myeclipse修改jdk版本流程 很多时候,项目没有用对jdk版本时候,项目报错,在MyEclipse中,要修改JDK版本 有三处地方需要注意:!! 1.第一处 2.第二处 3.第三处

  3. accecc2010入门,语文

    accecc2010入门 数据库:存放数据并处理的仓库. access2010数据库(扩展名为accdb,改名时不能删扩展名): 1,功能区:代替了菜单栏和工具栏的功能,不用四处查找命令.在窗口下的顶 ...

  4. C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序

    本教程适用于Windows系统 从浏览器上打开本地程序,主要用到了本地URL协议,其实主要就是改注册表 先建立一个项目,我建的是控制台项目 在Program.cs写2个静态方法用来添加注册表.移除注册 ...

  5. IoC(控制反转)和DI(依赖注入)

    一.IOC 1.目标类 提供UserService接口和实现类 获得UserService实现类的实例 之前开发中,直接new一个对象即可,使用spring之后,将由spring创建  -->I ...

  6. asp.net 翻页时用ViewState保存上一页checkbox勾选的值

    /// <summary>        /// checkbox勾选取消勾选事件        /// </summary>        /// <param nam ...

  7. 用户“Michael-PC\Michael”不具有所需的权限。请验证授予了足够的权限并且解决了 Windows 用户帐户控制(UAC)限制问题。

    解决方法:在注册表增加键值 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System] 新建-选择“D ...

  8. 树莓派WLAN连接PC(不通过路由器)

    上一篇博文捣鼓了一下树莓派直连线连接PC.吃完午饭心血来潮,树莓派既然能用直连线连接PC,曾经也试过拿PC当作热点,为何不尝试一下用WLAN将树莓派与PC互连呢?果断搞起. 首先,我当前笔记本是用WL ...

  9. orientationchange事件

    orientationchange事件 resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize':

  10. 【Android学习入门】Android studio基本设置

    1.背景设置 依次选择File->Settings-->Appearance & Behaviour->Apprearance,然后勾选 show line number. ...