设为首页 加入收藏

TOP

WSAEventSelect模型详解(二)
2015-07-16 12:57:15 来源: 作者: 【 】 浏览:12
Tags:WSAEventSelect 模型 详解
kArray[nEvent]=server;
? ? nEvent++;


? ? while(true){
? ? ? ? int nIndex = ::WSAWaitForMultipleEvents(nEvent,eventArray,false,WSA_INFINITE,false);
? ? ? ? if( nIndex == WSA_WAIT_IO_COMPLETION || nIndex == WSA_WAIT_TIMEOUT ){
? ? ? ? ? ? cout<<"等待时发生错误!错误代码:"<? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? nIndex = nIndex - WSA_WAIT_EVENT_0;
? ? ? ? WSANETWORKEVENTS event;
? ? ? ? SOCKET sock = sockArray[nIndex];
? ? ? ? ::WSAEnumNetworkEvents(sock,eventArray[nIndex],&event);
? ? ? ? if(event.lNetworkEvents & FD_ACCEPT){
? ? ? ? ? ? if(event.iErrorCode[FD_ACCEPT_BIT]==0){
? ? ? ? ? ? ? ? if(nEvent >= WSA_MAXIMUM_WAIT_EVENTS){
? ? ? ? ? ? ? ? ? ? cout<<"事件对象太多,拒绝连接"<? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? sockaddr_in addr;
? ? ? ? ? ? ? ? int len = sizeof(sockaddr_in);
? ? ? ? ? ? ? ? SOCKET client = ::accept(sock,(sockaddr*)&addr,&len);
? ? ? ? ? ? ? ? if(client!= INVALID_SOCKET){
? ? ? ? ? ? ? ? ? ? cout<<"接受了一个客户端连接 "<? ? ? ? ? ? ? ? ? ? WSAEVENT eventNew = ::WSACreateEvent();
? ? ? ? ? ? ? ? ? ? ::WSAEventSelect(client,eventNew,FD_READ|FD_CLOSE|FD_WRITE);
? ? ? ? ? ? ? ? ? ? eventArray[nEvent]=eventNew;
? ? ? ? ? ? ? ? ? ? sockArray[nEvent]=client;
? ? ? ? ? ? ? ? ? ? nEvent++;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }else if(event.lNetworkEvents & FD_READ){
? ? ? ? ? ? if(event.iErrorCode[FD_READ_BIT]==0){
? ? ? ? ? ? ? ? char buf[2500];
? ? ? ? ? ? ? ? ZeroMemory(buf,2500);
? ? ? ? ? ? ? ? int nRecv = ::recv( sock,buf,2500,0);
? ? ? ? ? ? ? ? if(nRecv>0){
? ? ? ? ? ? ? ? ? ? cout<<"收到一个消息 :"<? ? ? ? ? ? ? ? ? ? char strSend[] = "I recvived your message.";
? ? ? ? ? ? ? ? ? ? ::send(sock,strSend,strlen(strSend),0);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }else if(event.lNetworkEvents & FD_CLOSE){
? ? ? ? ? ? ::WSACloseEvent(eventArray[nIndex]);
? ? ? ? ? ? ::closesocket(sockArray[nIndex]);
? ? ? ? ? ? cout<<"一个客户端连接已经断开了连接"<? ? ? ? ? ? for(int j=nIndex;j? ? ? ? ? ? ? ? eventArray[j]=eventArray[j+1];
? ? ? ? ? ? ? ? sockArray[j]=sockArray[j+1];
? ? ? ? ? ? }
? ? ? ? ? ? nEvent--;
? ? ? ? } else if(event.lNetworkEvents & FD_WRITE ){
? ? ? ? ? ? cout<<"一个客户端连接允许写入数据"<? ? ? ? }
? ? } // end while
? ? ::closesocket(server);
}


int _tmain(int argc, _TCHAR* argv[])
{
? ? WSADATA wsaData;
? ? int error;
? ? WORD wVersionRequested;? ?
? ? wVersionRequested = WINSOCK_VERSION;
? ? error = WSAStartup( wVersionRequested , &wsaData );
? ? if ( error != 0 ) {
? ? ? ? WSACleanup();
? ? ? ? return 0;
? ? }


? ? WSAEventServerSocket();


? ? WSACleanup();
? ? return 0;
}



// 解释一下,为什么我在 socket函数前面加上 ::
因为我前面写的时候本来用了thread库准备开一个线程运行Server,另一个运行Client。
结果 用了 using namespace std;? 后,正好引入了bind函数(std的那个模板)把 socket的bind给覆盖了,
然后就一直是 错误了,查下错误代码是 10022(无效参数),检查时才发现的。


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Commons Math学习笔记 下一篇C# 测试代码的运行时间

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: