套接字不在Linux上发送全部内容(ubuntu)

时间:2011-08-13 16:11:47

标签: c++ linux sockets gcc 64-bit

我在通过TCP套接字发送大段数据时遇到了一个问题,花了大约3天试图分开问题而失败我决定最好转到这里寻求帮助/建议。

我的项目 我写了一个基本的HTTP服务器(稍微不相关)可以运行lua脚本来输出页面。这在Windows(32位)下完全正常。

问题

当在Ubuntu Linux(64位)上的TCP套接字上发送中/大文件(大约8000字节及以上的任何内容似乎有问题)时,它们看起来会以不同的长度切出(浏览器中显示的结果是值为8000到10200字节。当我检查发送函数的返回值时,每次发送结束时它都是9926字节。没有错误。

较小的文件发送绝对正常,并且在Windows下没有问题。根据这些信息,我认为这可能是缓冲区大小问题,所以我做了

cat /proc/sys/net/ipv4/tcp_mem
输出188416 192512 196608

这些数字远高于9926所以我认为这不是问题。

我正在使用CSimpleSockets作为套接字库,之前我没有遇到任何问题。如果问题出在这个库的内部,我在unix下使用的send函数的代码是:

#define SEND(a,b,c,d)          send(a, (const int8 *)b, c, d)

send(socket, buffer, bytestosend, 0);

缓冲区从const char *转换为const unsigned char*const int8 *,然后传递给要发送的操作系统。

好的,我认为这涵盖了我检查过的所有内容。如果您需要更多信息或者我错过了任何明显的东西,我会尽力提供。谢谢你的帮助!

2 个答案:

答案 0 :(得分:4)

您的问题是发送不保证发送传递给它的数据量。

它有可以填充的内部缓冲区,影响缓冲区的套接字参数等。你需要注意发送了多少字节,等待几毫秒(发送通过线路移动数据并清空缓冲区),然后发送剩余的数据。没有自动的方法来执行此操作,您需要编写一些逻辑,使缓冲区按实际发送的字节数增加。

答案 1 :(得分:2)

您使用的是阻止套接字还是非阻塞套接字?如果您使用非阻塞套接字,则必须(并且使用阻塞套接字,应该)检查短send(其中一个返回值)少于您要发送的字节数。