我正在尝试编写IOCP服务器。基本上,我接受了新的联系。出于测试目的,我正在运行并连接到127.0.0.1。
我在调用AcceptEx()之前创建了伪套接字。一旦接受连接,新的伪套接字用于通信。这个新套接字与io完成端口[CreateIoCompletionPort]相关联,然后我为它分配了几个选项,[SO_EXCLUSIVEADDRUSE]和[SO_CONDITIONAL_ACCEPT],然后我调用WSARecv()来接受传入数据。
问题是,一旦我的远程连接连接到服务器,它就会发送数据,但是从未收到过该数据。我想知道是否有人可以提供一些关于它为什么没有接收数据的想法?也许我的逻辑存在缺陷?我几次完成了我的代码。没有记录错误。
编辑:修正了措辞。我在AcceptEx()调用之前创建套接字。
我的代码中的基本逻辑:
// Create socket, associate with IOCP
WSASocket(af, type, proto, lpProtoInfo, g, dwFlags);
HANDLE hIOCP = GetPool()->GetQueueHandle();
CreateIoCompletionPort(hSource, hIOCP, 0, 0) != NULL;
// Server bind and listen
bind(m_shSocket, pAddr, nAddrLen);
listen(m_shSocket, nBacklog);
// Creation of the pseudo socket
SOCKET s = ::WSASocket(m_iSocketAf, m_iSocketType, m_iSocketProto, m_pWpi, m_SocketGroup, m_dwSocketFlags);
DWORD dwBytes;
BOOL bRet = m_fnAcceptEx(m_shSocket, s, chOutput, 0, sizeof(SOCKADDR_STORAGE) + 16, sizeof(SOCKADDR_STORAGE) + 16, &dwBytes, m_pcbAccept);
// ... New Connection comes in, it's accepted ...
// Associate new pseudo socket with IOCP
HANDLE hNewIOCP = GetPool()->GetQueueHandle();
CreateIoCompletionPort((HANDLE) s, hNewIOCP , 0, 0) != NULL;
// ... Remote socket sends ...
// ... Remote socket and Pseudo socket call WSARecv ...
// ... Pseudo socket does not receive ...
注意:我尝试从伪套接字发送到远程套接字,与以相反方式发送数据的问题相同。
答案 0 :(得分:1)
您需要发布一些代码,但您的描述没有意义。这不是基于AcceptEx()
的服务器的运作方式。
使用基于AcceptEx()
的服务器,您可以在发布AcceptEx()
之前创建已接受的套接字。然后,使用侦听套接字和新套接字以及允许您接收远程地址和(可选)数据的缓冲区发布AcceptEx()
。
因此,如果您在原始问题中描述代码,那么您的代码是错误的,或者您没有使用AcceptEx()
。我现在忽略了你投入混合的“少数几个选项”,因为他们现在只是进一步混淆了一些东西而没有任何代码需要分析。
您可能有兴趣下载我的free IOCP based server framework,其中包括工作AcceptEx()
和基于传统Accept()
的服务器代码。你可以从这里得到它:http://www.serverframework.com/products---the-free-framework.html
答案 1 :(得分:0)
您是否致电GetQueuedCompletionStatus来获取数据?
如果你不这样做只是为了自己学习,我还建议你使用boost::asio - 一个优秀的库,允许你让其他人做繁琐的代码来处理io完成端口。
答案 2 :(得分:0)
我明白了。我是个白痴。我发送零字节。