我正在开发一个通过UDP连接发送大量消息的应用程序。
有时一些数据包丢失,经过一些测试后我得出结论说套接字很忙。
因此,我在调用sendto API之间进行了一次小小的睡眠,试图在最后一次发送之前阻止新的发送。
它有效,但我想使用更好的方法,比如处理信号或其他一些指向我之前发送的信号。
有类似的吗?
我在Linux环境中使用C ++语言。
以下代码段显示了我正在做的事情:
#define MAX_SIZE 4096
string long_msg = GetLongMessage();
if (!long_msg.empty()) {
long int to_send = long_msg.size();
while (to_send) {
long int ret = sendto(socket_fd,
&long_msg[long_msg.size() - to_send],
(to_send > MAX_SIZE ? MAX_SIZE : to_send), 0,
reinterpret_cast<struct sockaddr*>(&addr_client),
addr_client_len);
if (ret > 0) {
to_send -= ret;
sleep(10);
} else {
// Log error
}
}
}
编辑:这个问题的目的是知道一种方法来检测UDP套接字是否由于先前的发送调用而忙,而不是讨论TCP与UDP的优缺点。