在event sock中,FD_READ很简单,当系统的sock缓冲区有数据时,就会发出FD_READ,此时我们就可以用read,WSArecv等去接收数据.
FD_WRITE来说理解起来相对困难一些.激发FD_WRTTE有三种情况.
1.作为客户端,当和服务器建立一个连接时,会激发FD_WRITE.
2.作为服务器端,当接受到一个连接时,会激发FD_WRTTE.
2.当系统sock缓冲区填满后,缓冲区有空闲时就会激发FD_WRITE.
所以在用event select 时,应该如下写:
........
BOOL bSockIsBlocked; //sock是否被发送阻塞
.....
case FD_READ:
recv(......);//接受
........ //根据接受的情况处理想发送的数据
if(!bSockIsBlocked)
while(1)
{
ret =send(....); //若发送不阻塞就可以直接发送;
if(ret ==SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK)
{
bSockIsBlocked = TRUE;
break;
}
break;
case FD_WRITE:
bSockIsBlocked = FALSE;
while(1)
{
ret =send(....); //若发送不阻塞就可以直接发送;
if(ret ==SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK)
{
bSockIsBlocked = TRUE;
break;
}
break;
...................
阅读(712) | 评论(0) | 转发(0) |