基于事件的异步套接字

来源:互联网 发布:vue node 编辑:程序博客网 时间:2024/05/24 01:49
主要用到的是WSAEventSelect模型


下面是一个简单的示例代码:
//控制箱开机char *pCmd = "ONCP\r\n";SOCKETsck=socket(PF_INET,SOCK_STREAM,0);if(INVALID_SOCKET ==sck)ATLASSERT(0);WSAEVENT hEvent = WSACreateEvent();WSAEventSelect(sck,hEvent,FD_READ|FD_CONNECT);struct sockaddr_in to;to.sin_family=AF_INET;to.sin_port=htons(SOCKET_POWERPORT);to.sin_addr.s_addr=htonl(pconfig->dwIP);try{WSAConnect(sck,(struct sockaddr*)&to,sizeof(to),NULL,NULL,NULL,NULL);int nTry=10;int ret=0;int err=-1;BYTE buffer[1024]={0};int i=0;for(i=0;i<30;i++){if(WSAWaitForMultipleEvents(1,&hEvent,0,100,0)!=WSA_WAIT_EVENT_0){err = -1;}else{WSANETWORKEVENTS events;WSAEnumNetworkEvents(sck,hEvent,&events);if( (events.lNetworkEvents | FD_CONNECT)==0 || events.iErrorCode[4]!=0){err = -1;}elseerr=0;}if(err==0) break;Sleep(100);}if (err != 0){//错误*bstrMsg = SysAllocString(L"连接控制器失败,请检查控制器地址配置是否正确");throw(1);}else {while(--nTry){if(nTry<9)Sleep(1000);ret=send(sck,(const char*)pCmd, strlen(pCmd),0);if( ret!=strlen(pCmd) ){*bstrMsg = SysAllocString(L"错误:发送数据失败");throw(5);}//接收返回数据for(i=0;i<30;i++){ret=0;ret=recv(sck, (char*)buffer, 1023, 0);if(ret > 0)break;Sleep(100);}//容错M61E//if(ret==1)if(ret>0){if( buffer[0]==0){*lSuccess= TRUE;throw(0);}continue;}else{continue;}}//end while(nTry--)}if(ret>0){if( buffer[0]==1){*bstrMsg = SysAllocString(L"错误:开启计算机失败,请等待3分钟后再进行操作");throw(2);}else if( buffer[0]==2){*bstrMsg = SysAllocString(L"错误:计算机已开启");throw(3);}else if( buffer[0]==3){*bstrMsg = SysAllocString(L"错误:正在开机过程中");throw(4);}else{OutputDebugString("接收开机指令返回不符合协议");*bstrMsg = SysAllocString(L"接收开机指令返回不符合协议");}}else{OutputDebugString("接收开机指令失败:指令无返回");*bstrMsg = SysAllocString(L"接收开机指令失败:指令无返回");throw(5);}}catch(int err){if(sck!=INVALID_SOCKET){closesocket(sck);}sck=INVALID_SOCKET;if(err){*lSuccess= FALSE;return S_FALSE;}else{*lSuccess= TRUE;return S_OK;}}