C++ 套接字未在Linux(ubuntu)上发送全部内容

C++ 套接字未在Linux(ubuntu)上发送全部内容,c++,linux,sockets,gcc,64-bit,C++,Linux,Sockets,Gcc,64 Bit,我在通过TCP套接字发送大数据段时遇到了一个问题,我花了大约3天的时间试图解决这个问题,但失败了。我决定最好在这里寻求帮助/建议 我的项目 我已经编写了一个基本的HTTP服务器,它(稍微不相关)可以运行lua脚本来输出页面。这一切在Windows(32位)下都可以正常工作 问题 当通过Ubuntu Linux(64位)上的TCP套接字发送中/大型文件(大约8000字节及以上的任何文件似乎都有问题)时,它们似乎以不同的长度剪切(浏览器中显示的结果是8000到10200字节之间的值。当我检查发送函数

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

我的项目 我已经编写了一个基本的HTTP服务器,它(稍微不相关)可以运行lua脚本来输出页面。这一切在Windows(32位)下都可以正常工作

问题

当通过Ubuntu Linux(64位)上的TCP套接字发送中/大型文件(大约8000字节及以上的任何文件似乎都有问题)时,它们似乎以不同的长度剪切(浏览器中显示的结果是8000到10200字节之间的值。当我检查发送函数的返回值时,每次发送结束时,返回值正好是
9926
字节。无错误

较小的文件发送完全正常,在windows下没有问题。关于这个信息,我认为可能是缓冲区大小的问题,所以我做了

cat /proc/sys/net/ipv4/tcp_mem
输出的
188416192512 196608

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

我使用的是套接字库,以前没有任何问题。如果问题在库中,我在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*
,然后传递到要发送的操作系统


好的,我想这涵盖了我检查的所有内容。如果您需要更多信息,或者我遗漏了任何明显的信息,我会尽力提供。谢谢您的帮助!

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


它具有可填充的内部缓冲区、影响缓冲区的套接字参数等。您需要注意发送了多少字节,等待几毫秒(等待发送通过线路移动数据并清空缓冲区),然后发送剩余的数据。没有自动的方法可以做到这一点,您需要编写一点逻辑,使缓冲区按实际发送的字节数前进。

您使用的是阻塞套接字还是非阻塞套接字?如果您使用的是非阻塞套接字,您必须(使用阻塞套接字,您应该)检查是否有短的
发送
(返回值小于要发送的字节数的发送).

顺便说一句,这与Linux或64位无关。您现在看到这一点是因为缓冲区小了一点。尝试从Windows端发送1 MB数据,并看到完全相同的情况(可能是32 kb或64 kb的数据)谢谢,我使用的是阻塞套接字,但是你说的是正确的,但是另一个人先到了那里。使用阻塞套接字,如果发送被信号中断,你应该只看到短发送。我使用的套接字库中有一个while循环,如果发送被信号中断,它将继续发送,所以可能有一个bug或者其他什么ng。我会给开发者发电子邮件。再次感谢你的帮助