winsock select模型实现
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模型实现相关推荐
- WinSock学习笔记3:Select模型
WinSock学习笔记3:Select模型 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, G ...
- WinSock I/O 模型 -- Select 模型
简介 Select 模型是 WinSock 中最常见的 I/O 模型,这篇文章我们就来看看如何使用 Select api 来实现一个简单的 TCP 服务器. API 基础 Select 模型依赖 Wi ...
- java socket编程 select_windows socket编程select模型使用
int select( int nfds, //忽略 fd_ser* readfds, //指向一个套接字集合,用来检测其可读性 fd_set* writefds, / ...
- socket select模型
由于socket recv()方法是堵塞式的,当多个客户端连接服务器时,其中一个socket的recv调用时,会产生堵塞,使其他连接不能继续. 如果想改变这种一直等下去的焦急状态,可以多线程来实现(不 ...
- 转:socket select模型示例
// selectSocketMode.cpp : Defines the entry point for the console application. // #include "std ...
- Windows环境下IOCP和SELECT模型性能比较
在大量客户端连接的情况下,IOCP模型应该是具有先天优势的,首先是每次调用时不需要传入socket列表,其次是他在通知时就已经完成了IO操作,节省了系统调用. 道理是这么个道理,然而在实际应用过程当中 ...
- 详细解析SELECT模型
先看一下下面的这句代码: int iResult = recv(s, buffer,1024); 这是用来接收数据的,在默认的阻塞模式下的套接字里,recv会阻塞在那里,直到套接字连接上有数据可读,把 ...
- 【转载】socket select模型
由于socket recv()方法是堵塞式的,当多个客户端连接服务器时,其中一个socket的recv调用时,会产生堵塞,使其他连接不能继续. 如果想改变这种一直等下去的焦急状态,可以多线程来实现(不 ...
- socket编程(二) select 模型
select 模型是winsock中最常见的I/O模型,主要是它能够防止程序在套接字处于阻塞模式的时候经过一次I/O操作后被阻塞,同时也能够防止套接字处于非阻塞模式产生的WSAEWOULDBLOCK错 ...
最新文章
- cas server 配置
- tensorflow mnist 1
- js插件---WebUploader 如何接收服务端返回的数据
- Java创建cookie和删除cookie
- python中自动化办公 【笔记】
- f3arra1n3.4.1版本_Sysmon v11.1新版本功能测试报告
- ac9560不支持承载_工程人还在为松软土层地质问题处理而烦恼?不,这里告诉你!...
- bash实现自动补全
- IdentityServer的基本概念与特性
- UV的入门使用方法,简单,快捷,包教包会
- Ultimaker_Cura-4.8-Win版本软件下载与安装
- 公司java项目上线生产环境发布流程
- LabVIEW终止符
- 小刘同学的第一百三十一篇博文
- CleanMyMac X2023最新版安装图文详解
- 中断驱动的自行车码表
- iOS-Runtime之SEL、IMP、Method
- Flutter中的依赖注入——get_it
- CAD梦想画图中的“线型设置”
- 网文如何偷走了我的时间?
热门文章
- Find The Multiple POJ - 1426(只包含01的十进制倍数(同余模定理))
- A - 排名 HDU - 1236 sort(cmp)
- python tqdm 不换行_python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
- java errorlevel_bat中errorlevel与%errorlevel%的区别
- 我所经历的京东618
- springboot整合mybatis和mybatis-plus
- 人工智能高考511分,未来有望考上东京大学!
- 设计模式六大原则(5):迪米特法则
- linux下rpm,yum学习
- 资料库保存树结构的三种方法