gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:30:27 25 4
gpt4 key购买 nike

我在通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com