select连接TCPIP数据收发测试(连接多客户)
来源:互联网 发布:华彬快销品网络商学院 编辑:程序博客网 时间:2024/06/07 06:36
下面给出一个简单的select模型的服务端套接字,非阻塞模式。可以连接多个客户端,没连接1个客户接收100MB数据后,返回OK退出。
bool InitAndListen(SOCKET &sListen){sockaddr_in local;local.sin_family = AF_INET;local.sin_addr.s_addr = INADDR_ANY;local.sin_port = htons((u_short)TCPSERVER_PORT);//Initial socketsListen = socket(AF_INET, SOCK_STREAM, 0);if (sListen == INVALID_SOCKET){printf("Initial socket failed\n");return 0;}//Bind socketif (bind(sListen, (sockaddr*)&local, sizeof(local)) != 0){printf("Bind socket failed\n");return 0;}if (listen(sListen, 10) != 0) //Listen socket{printf("Listen socket failed");return 0;}return 1;}int SelectTcpRecver(){SOCKET sListen;if (0 == InitAndListen(sListen))return -1;printf("Sever:%d wait for client connect ...\n", TCPSERVER_PORT);fd_set fdSocket;FD_ZERO(&fdSocket);FD_SET(sListen, &fdSocket);while (1){fd_set fdRead = fdSocket;int nRet = select(NULL, &fdRead, NULL, NULL, NULL);if (nRet <= 0){printf("Select failed\n");break;}for (int i = 0; i < (int)fdSocket.fd_count; i++){if (fdSocket.fd_array[i] == sListen){sockaddr_in addrRemote;int AddrLen = sizeof(addrRemote);SOCKET sNew = ::accept(sListen, (sockaddr *)&addrRemote, &AddrLen);FD_SET(sNew, &fdSocket);//将套接字sNew放到fdSocket中printf("Client %s connected\n", inet_ntoa(addrRemote.sin_addr));}else{char * Buffer = (char *)malloc(MB100);if (NULL == Buffer){printf("100MB 内存分配失败!\n");return -1;}DWORD nRemainRecv = MB100;char * pBuf = (char *)Buffer;int len, ret;//接收100MB的数据while (nRemainRecv > 0){len = recv(fdSocket.fd_array[i], pBuf, nRemainRecv, 0);if (len < 0){printf("Recv HeadDate Fail:%d\n", len);break;}else if (len == 0){printf("Pre len is 0 client quit!\n");break;}printf("接收数据:%d\n", len);nRemainRecv -= len;pBuf += len;}free(Buffer);printf("共接收数据:%d\n", MB100);char szBuff[8];sprintf_s(szBuff, _countof(szBuff), "%s", "OK");ret = send(fdSocket.fd_array[i], szBuff, (int)strlen(szBuff), 0);if (ret == 0)printf("send 0\n");else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());}closesocket(fdSocket.fd_array[i]);FD_CLR(fdSocket.fd_array[i], &fdSocket);}//End For}//End while}return 0;}
发送端和上遍博客一样
0 0
- select连接TCPIP数据收发测试(连接多客户)
- select连接TCPIP数据收发测试
- select i/o + 多线程 实现多个客户连接
- (原创)TCPIP的二次封装,可同时多客户端收发数据
- Socket异步编程——多客户的异步连接和收发
- tcpip长连接 原理
- 数据连接测试
- 测试ibatis3连接数据
- 1、TCPIP 建立连接的过程(3-way shake)
- tcpip详解笔记(15) TCP协议连接过程
- C# TCP/IP 连接实现数据收发 Demo (Visual Studio)
- App 和设备通过蓝牙连接收发数据
- 开发低功耗蓝牙4.0血压计连接与收发数据
- Qt实现TcpClient和TcpServer连接收发数据
- select 连接
- 数据的测试与连接
- 用select模式收发处理数据(跨平台)
- 数据报形式的无连接客户/服务器交互
- 黑马程序员——Java基础 ---集合
- wholesale jerseys online
- MacOS搭载opencv开发环境
- HDU 2925 Musical Chairs
- 【 D3.js 进阶系列 — 3.0 】 分区图
- select连接TCPIP数据收发测试(连接多客户)
- php模拟登录QQ空间3.0 2014-11-23
- 多元函数求极值问题
- C++读取与保存bmp图片文件编程实现
- JAVA枚举及其用法
- iOS设计模式之观察者模式
- 第五章思维导图
- 算法提高 最大乘积
- ddedeep learr'n机器学习