首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

WSAEventSelect模型有关问题,为什么判断了一次后就无法判断了,一直超时

2013-12-28 
WSAEventSelect模型问题,为什么判断了一次后就无法判断了,一直超时while(TRUE){char information[500]

WSAEventSelect模型问题,为什么判断了一次后就无法判断了,一直超时


while(TRUE)
{
char information[500]="";
gets(information);

int s=WSAWaitForMultipleEvents(1,myevent,TRUE,0,FALSE);
if(s!=WSA_WAIT_FAILED&&s!=WSA_WAIT_TIMEOUT)
WSAEnumNetworkEvents(mysocket[0],myevent[0],&EventStatus);
else continue;

if(EventStatus.lNetworkEvents&FD_WRITE)
{
if(EventStatus.iErrorCode[FD_WRITE_BIT]==0)
{
cout<<information<<endl;
send(mysocket[0],information,sizeof(information),0);
}
}

else if(EventStatus.lNetworkEvents&FD_CLOSE)
{
if(EventStatus.iErrorCode[FD_CLOSE_BIT]==0)
{
if(SOCKET_ERROR==closesocket(mysocket[0]))
{
cerr<<"The socket is close error!"<<"The error number is:"<<WSAGetLastError()<<endl;
            return THE_EXE_IS_ERROR;
}
myevent[0]=0;
}
}
else continue;
}

为什么WSAWaitForMultipleEvents这个函数的返回值在第一次输入之后都是超时?非常不解,求解好心人讲解原理。

完整代码:

#include<iostream>
#include<winsock2.h>
#pragma comment(lib,"ws2_32")
#define THE_EXE_IS_RIGHT 0
#define THE_EXE_IS_ERROR -1
using namespace std;

int main(int argc,char** argv)
{
WSADATA wsadata;

if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
{
cerr<<"The socker is start error!"<<endl;
return THE_EXE_IS_ERROR;
}

SOCKET mysocket[1];
WSAEVENT myevent[1];
mysocket[0]=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if(mysocket[0]==INVALID_SOCKET)
{
cerr<<"The socket is create error!"<<"The error number is:"<<WSAGetLastError()<<endl;
return THE_EXE_IS_ERROR;
}

int herport=3030;
SOCKADDR_IN myaddr;
myaddr.sin_family=AF_INET;
myaddr.sin_port=htons(herport);
myaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

if(SOCKET_ERROR==connect(mysocket[0],(SOCKADDR*)&myaddr,sizeof(myaddr)))
{
cerr<<"The socket is connect error!"<<"The error number is:"<<WSAGetLastError()<<endl;
return THE_EXE_IS_ERROR;
}

myevent[0]=WSACreateEvent();

WSAEventSelect(mysocket[0],myevent[0],FD_WRITE|FD_CLOSE);
WSANETWORKEVENTS EventStatus;

while(TRUE)
{
char information[500]="";
gets(information);

int s=WSAWaitForMultipleEvents(1,myevent,TRUE,0,FALSE);
if(s!=WSA_WAIT_FAILED&&s!=WSA_WAIT_TIMEOUT)
WSAEnumNetworkEvents(mysocket[0],myevent[0],&EventStatus);
else continue;

if(EventStatus.lNetworkEvents&FD_WRITE)
{
if(EventStatus.iErrorCode[FD_WRITE_BIT]==0)
{
cout<<information<<endl;
send(mysocket[0],information,sizeof(information),0);
}
}

else if(EventStatus.lNetworkEvents&FD_CLOSE)
{
if(EventStatus.iErrorCode[FD_CLOSE_BIT]==0)
{
if(SOCKET_ERROR==closesocket(mysocket[0]))
{
cerr<<"The socket is close error!"<<"The error number is:"<<WSAGetLastError()<<endl;
            return THE_EXE_IS_ERROR;
}
myevent[0]=0;
}
}
else continue;
}
WSACleanup();
return THE_EXE_IS_RIGHT;
}

[解决办法]
unsigned int index = WSAWaitForMultipleEvents(1, hEvents, FALSE, WSA_INFINITE, FALSE); 
if (WSA_WAIT_EVENT_0 == index) {
// ...
WSAEnumNetworkEvents
}

热点排行