select模型的原理是在指定的socket 的数组中轮询的采集是否可写、可读、有异常的信息,然后将可以操做的套接字 保存在指定的数组中。

// selectsocket.cpp : 定义控制台应用程序的入口点。
//
//socket select 模型 缺点实时性不太强#include "stdafx.h"
#include <iostream>
#include <WinSock2.h>using namespace std;
#pragma comment(lib,"ws2_32.lib")struct clientInfo{SOCKET connectSock;SOCKADDR_IN clientAddr;
};clientInfo _arrayClientInfo[FD_SETSIZE];
int _curCount = 0;DWORD WINAPI WorkThread(LPVOID lpParameter)
{//接受和回复 消息FD_SET readAry;FD_ZERO(&readAry);//超时时间timeval outTime;outTime.tv_sec = 5;outTime.tv_usec = 0;char buf[1024] ={0};while(true){FD_ZERO(&readAry);for(int i = 0;i < _curCount;i++){if(_arrayClientInfo[i].connectSock != -1){FD_SET(_arrayClientInfo[i].connectSock,&readAry);}}int rtValue = select(0,&readAry,NULL,NULL,&outTime);if(rtValue != 0 && rtValue != SOCKET_ERROR){//输出收到的数据并且回复for(int i = 0; i< _curCount;i++){if(FD_ISSET(_arrayClientInfo[i].connectSock,&readAry)){if(0 == recv(_arrayClientInfo[i].connectSock,buf,sizeof(buf),0)){_arrayClientInfo[i].connectSock = -1;continue;}cout << "recv data by:" << inet_ntoa(_arrayClientInfo[i].clientAddr.sin_addr) <<" " << buf << endl;send(_arrayClientInfo[i].connectSock,"hello",sizeof("hello"),0);}}}}
}int _tmain(int argc, _TCHAR* argv[])
{//1 初始化windows socket库WSADATA wsaData;if(0 != WSAStartup(MAKEWORD(2,2),&wsaData)){cout << "WSAStartup failed" <<endl;return -1;}//2 创建套接字SOCKET listenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(INVALID_SOCKET == listenSocket){cout << "socket failed errcode:" << WSAGetLastError() << endl;return -1;}//3 绑定套接字SOCKADDR_IN serAddr;serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");    //将字符串转成数字并且是网络字节序serAddr.sin_family = AF_INET;serAddr.sin_port = htons(8000);if(0 !=bind(listenSocket,(sockaddr*)&serAddr,sizeof(sockaddr))){cout << "bind failed errcode:" << WSAGetLastError() << endl;return -1;}//4 监听if(SOCKET_ERROR == listen(listenSocket,10)){cout << "listen failed errcode:" << WSAGetLastError() << endl;return -1;}cout << "开启监听" << endl;//创建线程以应答 客户端的请求CreateThread(NULL,NULL,WorkThread,NULL,0,NULL);//接受链接请求SOCKET connectSock;SOCKADDR_IN clientAddr;int iSizeofAddr = sizeof(sockaddr);while (_curCount < FD_SETSIZE){connectSock = accept(listenSocket,(sockaddr*)&clientAddr,&iSizeofAddr);if(INVALID_SOCKET != connectSock){//建立连接成功_arrayClientInfo[_curCount].clientAddr = clientAddr;_arrayClientInfo[_curCount].connectSock = connectSock;_curCount++;}}//当前达到64 个链接的时候 关闭 监听套接字 本程序只接受64个连接closesocket(listenSocket);cout << "链接已满" << endl;system("pause");return 0;
}

缺点是 需要不断的轮询,处理不够及时。

客户端代码:

// sockclient.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <iostream>
#include <WinSock2.h>using namespace std;
#pragma comment(lib,"ws2_32.lib")int _tmain(int argc, _TCHAR* argv[])
{WSADATA wsaData;WSAStartup(MAKEWORD(2,2),&wsaData);SOCKADDR_IN serAddr;serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");serAddr.sin_family = AF_INET;serAddr.sin_port = htons(8000);SOCKET clientSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);connect(clientSocket,(sockaddr*)&serAddr,sizeof(sockaddr));char buf[1024] ={0};send(clientSocket,"hello server",sizeof("hello server"),0);recv(clientSocket,buf,sizeof(buf),0);cout << buf << endl;closesocket(clientSocket);WSACleanup();system("pause");return 0;
}

winsock select模型实现相关推荐

  1. WinSock学习笔记3:Select模型

    WinSock学习笔记3:Select模型 unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, G ...

  2. WinSock I/O 模型 -- Select 模型

    简介 Select 模型是 WinSock 中最常见的 I/O 模型,这篇文章我们就来看看如何使用 Select api 来实现一个简单的 TCP 服务器. API 基础 Select 模型依赖 Wi ...

  3. java socket编程 select_windows socket编程select模型使用

    int select( int nfds,            //忽略 fd_ser* readfds,    //指向一个套接字集合,用来检测其可读性 fd_set* writefds,   / ...

  4. socket select模型

    由于socket recv()方法是堵塞式的,当多个客户端连接服务器时,其中一个socket的recv调用时,会产生堵塞,使其他连接不能继续. 如果想改变这种一直等下去的焦急状态,可以多线程来实现(不 ...

  5. 转:socket select模型示例

    // selectSocketMode.cpp : Defines the entry point for the console application. // #include "std ...

  6. Windows环境下IOCP和SELECT模型性能比较

    在大量客户端连接的情况下,IOCP模型应该是具有先天优势的,首先是每次调用时不需要传入socket列表,其次是他在通知时就已经完成了IO操作,节省了系统调用. 道理是这么个道理,然而在实际应用过程当中 ...

  7. 详细解析SELECT模型

    先看一下下面的这句代码: int iResult = recv(s, buffer,1024); 这是用来接收数据的,在默认的阻塞模式下的套接字里,recv会阻塞在那里,直到套接字连接上有数据可读,把 ...

  8. 【转载】socket select模型

    由于socket recv()方法是堵塞式的,当多个客户端连接服务器时,其中一个socket的recv调用时,会产生堵塞,使其他连接不能继续. 如果想改变这种一直等下去的焦急状态,可以多线程来实现(不 ...

  9. socket编程(二) select 模型

    select 模型是winsock中最常见的I/O模型,主要是它能够防止程序在套接字处于阻塞模式的时候经过一次I/O操作后被阻塞,同时也能够防止套接字处于非阻塞模式产生的WSAEWOULDBLOCK错 ...

最新文章

  1. cas server 配置
  2. tensorflow mnist 1
  3. js插件---WebUploader 如何接收服务端返回的数据
  4. Java创建cookie和删除cookie
  5. python中自动化办公 【笔记】
  6. f3arra1n3.4.1版本_Sysmon v11.1新版本功能测试报告
  7. ac9560不支持承载_工程人还在为松软土层地质问题处理而烦恼?不,这里告诉你!...
  8. bash实现自动补全
  9. IdentityServer的基本概念与特性
  10. UV的入门使用方法,简单,快捷,包教包会
  11. Ultimaker_Cura-4.8-Win版本软件下载与安装
  12. 公司java项目上线生产环境发布流程
  13. LabVIEW终止符
  14. 小刘同学的第一百三十一篇博文
  15. CleanMyMac X2023最新版安装图文详解
  16. 中断驱动的自行车码表
  17. iOS-Runtime之SEL、IMP、Method
  18. Flutter中的依赖注入——get_it
  19. CAD梦想画图中的“线型设置”
  20. 网文如何偷走了我的时间?

热门文章

  1. Find The Multiple POJ - 1426(只包含01的十进制倍数(同余模定理))
  2. A - 排名 HDU - 1236 sort(cmp)
  3. python tqdm 不换行_python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
  4. java errorlevel_bat中errorlevel与%errorlevel%的区别
  5. 我所经历的京东618
  6. springboot整合mybatis和mybatis-plus
  7. 人工智能高考511分,未来有望考上东京大学!
  8. 设计模式六大原则(5):迪米特法则
  9. linux下rpm,yum学习
  10. 资料库保存树结构的三种方法