gpt4 book ai didi

c++ - TCP IOCP 在 acceptex 之后收不到

转载 作者:行者123 更新时间:2023-11-28 08:24:32 66 4
gpt4 key购买 nike

我正在尝试编写一个 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 ...

注意:我尝试从伪套接字发送到远程套接字,与以相反方式发送数据的问题相同。

最佳答案

您需要发布一些代码,但您的描述没有意义。这不是基于 AcceptEx() 的服务器的运行方式。

使用基于AcceptEx() 的服务器,您可以在发送AcceptEx() 之前创建您接受的套接字。然后,您将 AcceptEx() 与监听套接字和新套接字以及一个缓冲区一起发布,该缓冲区允许您接收远程地址和可选的数据。

因此,如果您在原始问题中描述了您的代码,那么您的代码是错误的,或者您没有使用 AcceptEx()。我目前忽略了您放入组合中的“少数选项”,因为它们目前只会进一步混淆事物,而无需分析任何代码。

您可能有兴趣下载我的 free IOCP based server framework ,其中包括有效的 AcceptEx() 和传统的基于 Accept() 的服务器代码。你可以从这里得到它:http://www.serverframework.com/products---the-free-framework.html

关于c++ - TCP IOCP 在 acceptex 之后收不到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4504623/

66 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com