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

标签 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 下使用的发送函数的代码是:

#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/

相关文章:

c++ - 显式程序在 msvc 中有效,但在 gcc 中无效

c++ - 对 16 位灰度垫进行着色仅产生一半图像

php - Socket_read() 说 "not a valid resource"

c++ - 我使用什么 C++ 编译器选项来触发数组越界错误?

c++ - 当我需要专门化我在模板类中声明的类型名时,我必须使用哪些参数?

linux - 以 root 身份运行通知发送

linux - 使用 sudo 执行 2 个(类似的)命令,给出相同的精确输出

linux - 在 Bash 脚本中使用大括号内的 int 变量

python - 是否可以在没有握手的情况下启动 TCP 套接字连接?

c - 在 c unix 编程中,只允许在一个进程中使用 open() 打开文件