- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我无法理解以下代码段的工作方式和原因:
/* Now lets try to set the send buffer size to 5000 bytes */
size = 5000;
err = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(int));
if (err != 0) {
printf("Unable to set send buffer size, continuing with default size\n");
}
如果我们检查发送缓冲区的值,它确实正确设置为 5000*2 = 10000。但是,如果我们尝试发送超过发送缓冲区大小的内容,它会发送所有内容。例如:
n = send(sockfd, buf, 30000, 0);
/* Lets check how much us actually sent */
printf("No. of bytes sent is %d\n", n);
这会打印出 30000。
这究竟是如何运作的?发送缓冲区大小限制为 10000 的事实没有任何影响吗?如果是这样,究竟发生了什么?某种碎片?
更新:如果套接字处于非阻塞模式会怎样?我尝试了以下方法:
再一次,为什么?
最佳答案
设置SO_SNDBUF
选项的效果对于TCP和UDP是不同的。
因为看起来你在谈论 TCP,所以你观察到的效果可以解释为套接字处于阻塞模式,所以 send(2)
阻塞直到内核可以接受您的所有数据,和/或网络堆栈异步出列数据并将其推送到网卡,从而释放缓冲区中的空间。
此外,TCP 是一个流协议(protocol),它不保留任何“消息”结构。一个send(2)
可以对应另一边的多个recv(2)
,反之亦然。将其视为字节流。
关于c - SO_SNDBUF 的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8114280/
我无法理解以下代码段的工作方式和原因: /* Now lets try to set the send buffer size to 5000 bytes */ size = 5000
你能解释一下 SO_SNDBUF 和 SO_RCVBUF 选项到底是什么吗? 好的,出于某种原因,操作系统会缓冲传出/传入数据,但我想澄清一下这个问题。 他们的角色(通常)是什么? 它们是每个套接
我有一个测试 unix 域服务器,它有以下 SO_SNDBUF 设置为 1024000当连接进来时: for ( ; ; ) { connfd = accept(fdfromps, 0, 0)
我正在尝试使用较小的 SO_SNDBUF 值,主要是为了测试我自己的缓冲代码。 我已将它设置为 1024(尽管当我读回它时它是 4608)。我使用边缘触发的 epoll 在可以写入时得到通知。以下是我
我在 Linux 机器上有超过 300 万个文件描述符,所以我查看了套接字缓冲区大小与 RAM 大小的关系如何限制机器可以处理的最大同时 tcp 连接数。有没有类似经历的,请指教。谢谢。 最佳答案 这
我想使用 socketpair 在两个线程之间发送消息。我正在编写代码以找出使用 socketpair 可以发送多少条消息,消息大小为 16 字节(两个指针)。我使用的代码如下: int fds[2]
您好,我有以下程序来检查 UDP 套接字的发送缓冲区大小。但是,我的返回值让我有点困惑。我使用以下简单的应用程序: #include #include int main(int argc, cha
我试图降低我的非阻塞 TCP 套接字上的发送缓冲区大小,以便我可以正确显示上传进度条,但我看到了一些奇怪的行为。 我正在创建一个非阻塞的 TCP 套接字,将 SO_SNDBUF 设置为 1024,验证
我是一名优秀的程序员,十分优秀!