gpt4 book ai didi

C++ UDP 发送失败,需要 sleep

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:53:34 26 4
gpt4 key购买 nike

我有一个 UDP 客户端 C++ 代码 - 基于 WSA 套接字 - 运行良好。代码最初是用 VS6 编写的,我最近在 VS2010 中针对 64 位环境重新编译了它,只做了一些小的调整。

现在,如果在 sendto() 之后和 closesocket() 之前没有 Sleep(..) 或任何等效延迟,则 sendto() 无法发送内容。 “失败”意味着 sendto() 返回了适当数量的数据,但我在网络上看不到任何消息(我使用 wireshark 来检查这一点)。

这是我的代码:

void CTest::SendHello()
{
SOCKET sSocket;
sSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(m_strDstIpAddr);
addr.sin_port = htons(m_nTxPort);

int nMsgLen = 8;
char pTxBuffer[8];
*((DWORD*) &pTxBuffer[ 0]) = 0x11223344;
*((DWORD*) &pTxBuffer[ 4]) = 0;

int nSent = sendto(sSocket, pTxBuffer, nMsgLen, 0, (struct sockaddr *) &addr, sizeof(addr));
Sleep(10); // <- this seems to be necessary

if (nSent != nMsgLen)
{
CString s = "error sending HELO\n";
AfxMessageBox(s);
}
closesocket(sSocket);

如果没有 Sleep(),代码不会发送任何内容,但不会返回任何错误。使用 Sleep() 它可以工作。此外,这发生在发布版本中,当为调试编译时,代码也可以在没有 Sleep() 的情况下工作。

似乎在消息最终发送之前 closesocket() 关闭了套接字,但我认为 sendto() 是一个同步函数。我尝试使用 SO_LINGER,但这不适用于 SOCK_DGRAM 套接字。

由于代码在 DLL 中,我不能在 ctor 中创建套接字并在 dtor 中删除它,因为 SendHello() 可能会从不同的线程上下文中调用,我想避免使代码过于复杂.

谢谢你的帮助

最佳答案

使用 UDP 时,发送方和接收方之间的数据没有顺序,使用 UDP 数据报套接字发送的数据不能保证到达。在您的情况下,所有 sleep 实际上都是为数据到达另一端提供足够的时间。如果您想要确认接收和错误检查,那么您可以为 UDP 方案编写代码或使用 TCP。事实上,您可以完全关闭服务器,即使没有人在监听,您的客户端也会愉快地无误地发送 UDP 数据包。

要确保连接,请查看 connect()。没有什么可以阻止使用 UDP 连接,然后您可以使用 send() recv()。

关于C++ UDP 发送失败,需要 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23874855/

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