关于WSAEventSelect,为什么FD_WRITE事件只响应一次啊,大家帮我看看。。。。
int main(int argc, char* argv[])
{
WSADATA wd = { 0 };
WSAStartup( MAKEWORD( 2, 0 ), &wd );
//
// Create a TCP/IP stream socket
//
SOCKET Socket;
Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (Socket == INVALID_SOCKET)
{
printf("socket failed,error=%d",WSAGetLastError());
return 0;
}
//
// Create an event object to be used with this socket
//
WSAEVENT hEvent;
hEvent = WSACreateEvent();
if (hEvent == WSA_INVALID_EVENT)
{
printf("WSACreateEvent() Failed,error=%d",GetLastError());
closesocket(Socket);
return 0;
}
//
// Make the socket non-blocking and
// associate it with network events
//
int nRet;
nRet = WSAEventSelect(Socket,
hEvent,
FD_READ|FD_WRITE|FD_CLOSE);
if (nRet == SOCKET_ERROR)
{
PRINTERROR("EventSelect()");
closesocket(Socket);
WSACloseEvent(hEvent);
return 0;
}
//
// Lookup host
//
// Fill in the server address structure
//
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_addr.S_un.S_addr =inet_addr("192.168.0.2");
sa.sin_port = htons(700); // Well-known HTTP port
//
// Request a connection
//
nRet = connect(Socket,
(LPSOCKADDR)&sa,
sizeof(SOCKADDR_IN));
if (nRet == SOCKET_ERROR)
{
nRet = WSAGetLastError();
if (nRet == WSAEWOULDBLOCK)
{
fprintf(stderr,"\nConnect would block");
}
else
{
PRINTERROR("connect()");
closesocket(Socket);
WSACloseEvent(hEvent);
return 0;
}
}
//
// Handle async network events
//
char szBuffer[256];
strcpy(szBuffer,"hello");
WSANETWORKEVENTS events;
while(1)
{
//
// Wait for something to happen
//
fprintf(stderr,"\nWaitForMultipleEvents()");
DWORD dwRet;
dwRet = WSAWaitForMultipleEvents(1,
&hEvent,
FALSE,
WSA_INFINITE,
FALSE);
if (dwRet == WSA_WAIT_TIMEOUT)
{
fprintf(stderr,"\nWait timed out");
break;
}
//
// Figure out what happened
//
fprintf(stderr,"\nWSAEnumNetworkEvents()");
nRet = WSAEnumNetworkEvents(Socket,
hEvent,
&events);
if (nRet == SOCKET_ERROR)
{
PRINTERROR("WSAEnumNetworkEvents()");
break;
}
// //
// Handle events //
// //
// Connect event?
if (events.lNetworkEvents & FD_CONNECT)
{
fprintf(stderr,"\nFD_CONNECT: %d",
events.iErrorCode[FD_CONNECT_BIT]);
// nRet = send(Socket, szBuffer, strlen(szBuffer), 0);
if (nRet == SOCKET_ERROR)
{
PRINTERROR("send()");
break;
}
}
// Read event?
if (events.lNetworkEvents & FD_READ)
{
// Read the data and write it to stdout
char buf[256];
memset(buf,0,sizeof(buf));
nRet = recv(Socket, buf, sizeof(buf), 0);
if (nRet == SOCKET_ERROR)
{
PRINTERROR("recv()");
break;
}
printf("\n");
printf(buf);
// send(Socket,szBuffer,strlen(szBuffer),0);
}
// Close event?
if (events.lNetworkEvents & FD_CLOSE)
{
fprintf(stderr,"\nFD_CLOSE: %d",
events.iErrorCode[FD_CLOSE_BIT]);
break;
}
// Write event?
if (events.lNetworkEvents & FD_WRITE)
{
send(Socket,szBuffer,strlen(szBuffer),0);
}
nRet = WSAEventSelect(Socket,
hEvent,
FD_READ|FD_WRITE|FD_CONNECT|FD_CLOSE);
}
closesocket(Socket);
WSACloseEvent(hEvent);
return 0;
}