基于事件I/O模型的socket通信
来源:互联网 发布:开发java最好用的软件 编辑:程序博客网 时间:2024/05/18 14:25
WSADATA wsd;//WSADATA变量 SOCKET _socket; sockaddr_in _addr; //初始化套结字动态库//创建 if (WSAStartup(MAKEWORD(2,2), &wsd) != 0){WSACleanup();return;}if((_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET) {closesocket(_socket);WSACleanup();return;}//服务器地址_addr.sin_family=AF_INET; _addr.sin_port=htons(5050); //端口_addr.sin_addr.s_addr=INADDR_ANY; //系统分配ip//绑定if(bind(_socket,(SOCKADDR*)&_addr,sizeof(_addr))==SOCKET_ERROR) {closesocket(_socket);WSACleanup();return;}SOCKET sockets[WSA_MAXIMUM_WAIT_EVENTS];// Maximum number of wait objects 64 WSAEVENT events[WSA_MAXIMUM_WAIT_EVENTS];WSAEVENT newEvent;WSANETWORKEVENTS netWorkEvent;int eventTotal=0;int index;newEvent=WSACreateEvent();WSAEventSelect(_socket,newEvent,FD_ACCEPT|FD_CLOSE);//_socket为自定义的SOCKET,即服务器端的套接字listen(_socket,20);//监听sockets[eventTotal]=_socket;events[eventTotal]=newEvent;++eventTotal;while(true){index=WSAWaitForMultipleEvents(eventTotal,events,false,WSA_INFINITE,false);index-=WSA_WAIT_EVENT_0;//WSA_WAIT_EVENT_0其实是=0的,此处得到的是发生I/O的socket索引WSAEnumNetworkEvents(sockets[index],events[index],&netWorkEvent);if(netWorkEvent.lNetworkEvents&FD_ACCEPT)//新的链接请求{if(netWorkEvent.iErrorCode[FD_ACCEPT_BIT] != 0)std::cout<<"FD_ACCEPT failed with error "<<netWorkEvent.iErrorCode[FD_ACCEPT_BIT]<<"\n";else{sockaddr_in addr;int l=sizeof(sockaddr_in);SOCKET accpetSocket=::accept(_socket,(sockaddr*)&addr,&l);if(eventTotal>=WSA_MAXIMUM_WAIT_EVENTS){std::cout<<"too many connection\n";closesocket(accpetSocket);}else{std::cout<<"new connection at "<<accpetSocket<<"\n";newEvent=WSACreateEvent();WSAEventSelect(accpetSocket,newEvent,FD_READ|FD_CLOSE);//只监听读和关闭事件sockets[eventTotal]=accpetSocket;events[eventTotal]=newEvent;++eventTotal;}}}else if(netWorkEvent.lNetworkEvents&FD_READ)//客户端数据请求{std::cout<<"recv data from index "<<index<<"\n";conduct(sockets[index]);//自定义的处理读取时间的代码,要替换成自己的代码}else if(netWorkEvent.lNetworkEvents&FD_CLOSE)//客户端关闭请求{std::cout<<"close connection from index "<<index<<"\n";//移除关闭的socket<div style="text-indent: 28px;"></div>closesocket(sockets[index]);WSACloseEvent(events[index]); for(int i=index;i<eventTotal-1;++i){sockets[i]=sockets[i+1];events[i]=events[i+1];}--eventTotal;}}
0 0
- 基于事件I/O模型的socket通信
- socket通信之六:Overlapped I/O 事件通知模型实现的客户/服务器模型
- 基于Delphi的Socket I/O模型全接触
- 基于Delphi的Socket I/O模型全接触
- 基于Delphi的Socket I/O模型全接触
- 基于Delphi的Socket I/O模型全接触
- socket的I/O模型
- 基于事件通知的重叠I/O网络模型
- socket通信之七:Overlapped I/O 完成例程模型实现的客户/服务器模型
- Socket I/O模型
- Socket I/O模型
- Socket I/O模型
- socket i/o模型
- socket I/O 模型
- Socket I/O模型之重叠I/O(overlapped I/O)--事件通知
- Socket I/O 模型的性能参数
- socket相关的函数I/O模型
- Winodws Socket I/O模型的整理
- 启动Android模拟器后,在file Explorer中看不到任何文件
- 开发Web服务过程中遇到的一些问题
- Linux系统编程之获取文件信息
- poj2816 Popular Cows
- uva 10173 Smallest Bounding Rectangle
- 基于事件I/O模型的socket通信
- HDU 3982 半平面交+圆与多边形面积交
- 指针常量与常量指针
- 史上最简单的带流控功能的http server
- Arcpy基础入门-6、遍历
- 读取硬盘的MBR引导扇区(Windows各系统通用)
- Get和Post的区别
- clang_complete插件所需的libclang 的编译
- axjzsubggnabvvdshnfljqydcl