I am having trouble implementing the TCP IOCP client. I implemented kqueue on Mac OSX, so I wanted to do something similar on windows, and I understand that IOCP is the closest. The main problem is that GetCompetetionStatus never returns and always shuts down. I assume that I have something missing when creating a descriptor for control, but I donโt know what. I still got this:
My connection procedure: (for clarity, remove some error)
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);
Here is the sending procedure: (also for clarity).
IOPortConnect(int ServerSocket,int timeout,string& data){ char buf[BUFSIZE]; strcpy(buf,data.c_str()); WSABUF buffer = { BUFSIZE,buf }; DWORD bytes_recvd; int r; ULONG_PTR ulKey = 0; OVERLAPPED overlapped; OVERLAPPED* pov = NULL; HANDLE port; HANDLE hNewIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, ulKey, 0); CreateIoCompletionPort((HANDLE)ServerSocket, hNewIOCP , ulKey, 0); BOOL get = GetQueuedCompletionStatus(hNewIOCP,&bytes_recvd,&ulKey,&pov,timeout*1000); if(!get) printf("waiton server failed. Error: %d\n",WSAGetLastError()); if(!pov) printf("waiton server failed. Error: %d\n",WSAGetLastError()); port = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, (u_long)0, 0); SecureZeroMemory((PVOID) & overlapped, sizeof (WSAOVERLAPPED)); r = WSASend(ServerSocket, &buffer, 1, &bytes_recvd, NULL, &overlapped, NULL); printf("WSA returned: %d WSALastError: %d\n",r,WSAGetLastError()); if(r != 0) { printf("WSASend failed %d\n",GetLastError()); printf("Bytes transfered: %d\n",bytes_recvd); } if (WSAGetLastError() == WSA_IO_PENDING) printf("we are async.\n"); CreateIoCompletionPort(port, &overlapped.hEvent,ulKey, 0); BOOL test = GetQueuedCompletionStatus(port,&bytes_recvd,&ulKey,&pov,timeout*1000); CloseHandle(port); return true;
}
Any insight would be appreciated.