我在通过 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 下使用的发送函数的代码是:
#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 *
,然后传递给要发送的操作系统.
好的,我想这涵盖了我检查过的所有内容。如果您需要更多信息,或者我遗漏了任何明显的信息,我会尽力提供。感谢您的帮助!
最佳答案
您的问题是 send 不能保证发送传递给它的数据量。
它有可以填充的内部缓冲区,影响缓冲区的套接字参数等。您需要注意发送了多少字节,等待几毫秒(发送通过网络移动数据并清空缓冲区),然后发送剩余的数据。没有自动执行此操作的方法,您需要编写一些逻辑来将缓冲区按实际发送的字节数推进。
关于c++ - 套接字未在 Linux (ubuntu) 上发送全部内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7051667/