TCP数据包丢失的部分

时间:2016-05-03 17:50:07

标签: c++ sockets networking tcp boost-asio

我正在编写TCP服务器。我在localhost上运行正常。当我远程部署它时,一些字节在到达目的地的途中丢失了。

我在localhost上远程使用了netcat,并对两个输出进行了区分,丢失的字节是确定性的。

所以我怀疑它是丢包,因为相同的数据包不太可能丢失。

我试图将套接字上的写入大小减少到1000字节,但我仍然遇到了这个问题。

这种错误是否有任何常见原因?

我可以发布代码,但它只是来自Boost asio库的socket.send。我不确定错误来自代码,否则它将无法在localhost上运行。

提前感谢您的帮助

1 个答案:

答案 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函数。