熟悉事件模型进来帮忙看看
WSAEVENT events[WSA_MAXIMUM_WAIT_EVENTS];
int totalevent=0;
SOCKET sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
unsigned long val = 0;
if(ioctlsocket(sock,FIONBIO,&val)<0)
{
printf("ioctl failed\n");
closesocket(sock);
return 0;
}
sockaddr_in addr;
addr.sin_addr.S_un.S_addr=inet_addr("192.168.1.193");
addr.sin_port=htons(7890);
addr.sin_family=AF_INET;
if(connect(sock,(sockaddr*)&addr,sizeof(sockaddr_in))==SOCKET_ERROR)
printf("connect failed\n");
WSAEVENT event=::WSACreateEvent();
WSAEventSelect(sock,event,FD_READ|FD_WRITE|FD_CLOSE);
events[totalevent]=event;
totalevent++;
while(true)
{
int nindex=::WSAWaitForMultipleEvents(totalevent,events,false,2000,false);
if(nindex==WSA_WAIT_TIMEOUT)
{
continue;
}
else if(nindex==WSA_WAIT_FAILED)
{
continue;
}
else
{
WSANETWORKEVENTS netevent;
if(WSAEnumNetworkEvents(sock,events[nindex-WSA_WAIT_EVENT_0],&netevent)==0)
{
if(netevent.lNetworkEvents & FD_READ)
{
if(netevent.iErrorCode[FD_READ_BIT]!=0)
{
printf("read failed\n");
}
printf("read\n");
}
if(netevent.lNetworkEvents & FD_WRITE)
{
if(netevent.iErrorCode[FD_WRITE_BIT]!=0)
{
printf("write failed\n");
}
printf("write\n");
send(sock,"aa",2,0);
}
if(netevent.lNetworkEvents & FD_CLOSE)
{
if(netevent.iErrorCode[FD_CLOSE_BIT]!=0)
{
printf("close failed\n");
}
printf("close\n");
closesocket(sock);
::WSACloseEvent(events[nindex-WSA_WAIT_EVENT_0]);
}
}
else
{
printf("enumevent failed\n");
}
}
}
system("pause");
return 0;
}
服务器是为了测试写的,就是接收到请求后,新建一个socket,并放入一个新线程保持这个socket的连接.
程序运行后,首先打印出write,按我的理解是可写了,但是接下来在也不返回可写事件了,那么我怎么通过循环证明,这个socket一直可写,并写入数据呢.