TCP套接字发送的字节数较少

时间:2014-05-21 23:38:50

标签: c++ linux sockets boost-asio

我正在尝试使用boost.asio库发送大量字节,如下所示:

void tcp_send(boost::asio::io_service &io, const char *dst_ip, uint16 dst_port)
{
    uint8 *sbuff;
    size_t slen;
    ip::tcp::socket sock(io);

    sock.connect(ip::tcp::endpoint(ip::address::from_string(dst_ip), dst_port));

    sbuff = new uint8[100412];
    sbuff[0] = 67;
    sbuff[1] = 193;
    sbuff[2] = 136;
    sbuff[3] = 60;

    boost::asio::async_write(sock, boost::asio::buffer(sbuff, 100412),
             boost::bind((&send_handler), placeholders::error));
}

当我使用wireshark检查传输的字节数时,发送方始终只发送65536字节的数据,不包括TCP头字节。那可能是什么问题呢? 是否需要修改任何参数。

我在linux ubuntu上运行应用程序。似乎最大传输字节数是2 ^ 16。

Wireshark TCP Stream Flow

2 个答案:

答案 0 :(得分:1)

TCP是。 IP数据报或以太网帧中出现的字节数应该与您无关。

成功调用send并不一定意味着数据尚未发送;只是TCP堆栈接受了数据并承诺发送它(除非你指定PSH)。

答案 1 :(得分:0)

我发现了问题的根源。首先,我试图通过使用tcp_Send函数发送消息,并在从调用返回后,我存在该程序。因此,TCP堆栈没有足够的时间在其缓冲区中发送所有数据包。所以我应该给它一些时间。

现在在第二次试用中,我在发送消息后保持应用程序运行,但现在我在send_handler中收到错误,其中指出bad file descriptor。这是因为声明的套接字在退出tcp_send函数后被销毁。因此,要解决此问题,我应该将套接字定义为指针。或者最好的是使用write而不是async_Write