我正在编写TCP服务器。我在localhost上运行正常。当我远程部署它时,一些字节在到达目的地的途中丢失了。
我在localhost上远程使用了netcat,并对两个输出进行了区分,丢失的字节是确定性的。
所以我怀疑它是丢包,因为相同的数据包不太可能丢失。
我试图将套接字上的写入大小减少到1000字节,但我仍然遇到了这个问题。
这种错误是否有任何常见原因?
我可以发布代码,但它只是来自Boost asio库的socket.send。我不确定错误来自代码,否则它将无法在localhost上运行。
提前感谢您的帮助
答案 0 :(得分:2)
使用套接字和函数send()
发送数据时,它返回实际发送的字节数,这可能小于传递给函数的数量。
如果使用阻塞I / O,有时会使用这样的函数:
ssize_t send_all(int socket, const void *data, size_t len)
{
while (len > 0)
{
ssize_t r = send(socket, data, len, 0);
if (r < 0)
{ //you could also return -1 on EINTR
if (errno == EINTR)
continue;
else
return -1;
}
len -= r;
data = (const char*)data + r;
}
return len;
}
由于您使用的是boost::asio
,因此接近的原始套接字无效。但是在async_send文档中,您可以获得所需内容:
发送操作可能不会将所有数据传输到对等方。如果需要确保在异步操作完成之前写入所有数据,请考虑使用
async_write
函数。