我在通过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 *
,然后传递给要发送的操作系统。
好的,我认为这涵盖了我检查过的所有内容。如果您需要更多信息或者我错过了任何明显的东西,我会尽力提供。谢谢你的帮助!
答案 0 :(得分:4)
您的问题是发送不保证发送传递给它的数据量。
它有可以填充的内部缓冲区,影响缓冲区的套接字参数等。你需要注意发送了多少字节,等待几毫秒(发送通过线路移动数据并清空缓冲区),然后发送剩余的数据。没有自动的方法来执行此操作,您需要编写一些逻辑,使缓冲区按实际发送的字节数增加。
答案 1 :(得分:2)
您使用的是阻止套接字还是非阻塞套接字?如果您使用非阻塞套接字,则必须(并且使用阻塞套接字,应该)检查短send
(其中一个返回值)少于您要发送的字节数。