我在实施TCP IOCP客户端时遇到了一些麻烦.我已经在Mac OSX上实现了kqueue,所以我希望在Windows上做类似的事情,我的理解是IOCP是最接近的东西.主要问题是GetCompetetionStatus永远不会返回并且总是超时.我假设我在创建要监控的句柄时遗漏了一些东西,但不确定是什么.这是我到目前为止的地方:
我的连接例程:(为清晰起见,删除一些错误处理)
struct sockaddr_in server;
struct hostent *hp;
SOCKET sckfd;
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ((hp = gethostbyname(host)) == NULL)
return NULL;
WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED)
if ((sckfd = WSASocket(AF_INET,SOCK_STREAM,0, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
{
printf("Error at socket(): Socket\n");
WSACleanup();
return NULL;
}
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr = *((struct in_addr *)hp->h_addr);
memset(&(server.sin_zero), 0, 8);
//non zero means non blocking. 0 is blocking.
u_long iMode = -1;
iResult = ioctlsocket(sckfd, FIONBIO, &iMode);
if …
Run Code Online (Sandbox Code Playgroud)