请问一下,我现在做了一个在TCP客户端上使用IOCP模式,初始化时创建TCP套接字,创建IOCP句柄,使TCP套接字和IOCP句柄关联起来,创建工作线程,针对TCP套接字投递一个WASRecv操作,以下是代码:
m_hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);m_sTCPSock = socket(AF_INET, SOCK_STREAM, 0); CreateThread(NULL, 0, ServerWorkerThread, NULL, 0, &ThreadID);// Post Inital read operation for every socket in group
//
memset(&(m_PerOperation.OVerlapped), 0, sizeof(OVERLAPPED));
m_PerOperation.DATABuf.buf = m_PerOperation.Buffer;
m_PerOperation.DATABuf.len = 256;WSARecv(m_sTCPSock, &(m_PerOperation.DATABuf), 1, &RecvBytes, &Flag, &m_PerOperation.OVerlapped
, NULL); 在创建的工作线程中,首先connect连接服务器,连接成功以后就使用GetQueuedCompletionStatus等待,以下是工作线程代码:
DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID)
{
while (1)
{
ret = connect(m_sTCPSock, (SOCKADDR *)&addr, iSize);
if (ret == SOCKET_ERROR)
{
ErrorCode = GetLastError();
TRACE("connect failure errcode:%x\n", ErrorCode);
}
else
{
break;
} BOOL bSuccess = GetQueuedCompletionStatus(m_hCompletionPort, &dwRecvByte, (LPDWORD)&addr,
(LPOVERLAPPED*)&PerIoHandleData, INFINITE);
}
} 现在的问题是连接成功以后在GetQueuedCompletionStatus就一直等待,接收不到WINDOWS底层的事件?????请高手帮忙看一下,多提宝贵意见,谢谢!
m_hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);m_sTCPSock = socket(AF_INET, SOCK_STREAM, 0); CreateThread(NULL, 0, ServerWorkerThread, NULL, 0, &ThreadID);// Post Inital read operation for every socket in group
//
memset(&(m_PerOperation.OVerlapped), 0, sizeof(OVERLAPPED));
m_PerOperation.DATABuf.buf = m_PerOperation.Buffer;
m_PerOperation.DATABuf.len = 256;WSARecv(m_sTCPSock, &(m_PerOperation.DATABuf), 1, &RecvBytes, &Flag, &m_PerOperation.OVerlapped
, NULL); 在创建的工作线程中,首先connect连接服务器,连接成功以后就使用GetQueuedCompletionStatus等待,以下是工作线程代码:
DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID)
{
while (1)
{
ret = connect(m_sTCPSock, (SOCKADDR *)&addr, iSize);
if (ret == SOCKET_ERROR)
{
ErrorCode = GetLastError();
TRACE("connect failure errcode:%x\n", ErrorCode);
}
else
{
break;
} BOOL bSuccess = GetQueuedCompletionStatus(m_hCompletionPort, &dwRecvByte, (LPDWORD)&addr,
(LPOVERLAPPED*)&PerIoHandleData, INFINITE);
}
} 现在的问题是连接成功以后在GetQueuedCompletionStatus就一直等待,接收不到WINDOWS底层的事件?????请高手帮忙看一下,多提宝贵意见,谢谢!
你的服务器端是怎么写的?也是IOCP?
在while循环里连接到服务器,蹩脚的代码.
对IOCP理解不深!!!
最多一个WSASend WSARecv就足够了或者阻塞的socket也行。
connect之后,你没有把这个socket向内核注册,你怎么GetQueuedCompletionStatus 出来。
另外,lz对线程理解还不够