社区
网络编程
帖子详情
socket缓冲区可以设置多大呢
blairstar2
2011-10-28 09:40:31
大家好,小弟最近在学习网络编程,因为在做一个小实验,需要把80K大的数据发送给另一方,当我在使用setsockopt()设置缓冲区的大小时,居然在设置到1024*1024时,也没返回SOCKET_ERROR,所以心里有点疑问,Socket的缓冲区是不是可以设置为任意大小呢?另外,如果缓冲区设置很大,如80*1024,那使用Send()一次性发送70K的数据,能够一次性就发送出去吗?
谢谢大家!
...全文
6179
16
打赏
收藏
socket缓冲区可以设置多大呢
大家好,小弟最近在学习网络编程,因为在做一个小实验,需要把80K大的数据发送给另一方,当我在使用setsockopt()设置缓冲区的大小时,居然在设置到1024*1024时,也没返回SOCKET_ERROR,所以心里有点疑问,Socket的缓冲区是不是可以设置为任意大小呢?另外,如果缓冲区设置很大,如80*1024,那使用Send()一次性发送70K的数据,能够一次性就发送出去吗? 谢谢大家!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Gloveing
2011-10-29
打赏
举报
回复
[Quote=引用 15 楼 blairstar2 的回复:]
引用 14 楼 chenjintaoxp 的回复:
缓存区大小可以自己任意设定,只要你内容允许。send()多少数据,并不保证把缓存的数据一次发送,这取决你的网络,肯能会分好几次,recv也是这样的。
但我的确只是调用一次send()函数,就发送出去了,返回值为81922,但在接收端却是分四次接收,第一次27740,第二次27740,第三次14600,第四次11842,这应该怎么解释……
[/Quote]
你可能用的是
流式套接字
的缘故
Antineutrino
2011-10-28
打赏
举报
回复
[Quote=引用 10 楼 blairstar2 的回复:]
刚刚做了一个小试验,发送80K的数据,用Send()函数发送一次就发送出去了,返回发送字符数81922,但在接端使用Recv()接收,分四次接收,第一次27740,第二次27740,第三次14600,第四次11842。大家能帮忙解释解释吗?《TCPIP详解卷一》说最大报文段(MSS)为1024,即传往另外一端的最大数据长度为1024,怎么解释这两者之间关系呢?
[/Quote]
第一次接收27740个字节,只是说第一次时,TCP缓冲区中有不少于27740个字节的数据可以拿,因此应用程序先取了27740个字节来处理,第二次~第四次是一样的。
但这27740个字节具体是用多少个报文段发送过来的,就不得而知了。你也没办法通过设置应用程序的缓冲区大小来控制一次发送的报文段长度
Antineutrino
2011-10-28
打赏
举报
回复
缓冲区和报文长度是不一样的
简单来说,报文是逻辑上不能分割的最小传输单元(因为物理上虽然可能允许分为多个片,但假如任意一个片丢失或有错,那么整个报文都要重传,所以说它是逻辑上不可分割的),每个网络都能设置允许通过的最大报文段大小。
缓冲区是发送端和接收端都有的,而且会有多个。我们知道TCP/IP协议是分层的,一层处理完再交给另一层处理,因此每层都有自己的缓冲区:网卡驱动有缓冲区、IP层有缓冲区、TCP/UDP层有缓冲区、同样应用层也必须有缓冲区。这些缓冲区都是为了接收相应的报文的。
所以不要把缓冲区和报文长度弄混了,你在程序中把缓冲区设大或设小,仅仅是设置一次能够暂存多少未处理的报文数据而已。你需要发送80K的数据,假如最大报文长度是1024,那么你仍然至少需要发送80个报文
泥鳅不是鱼
2011-10-28
打赏
举报
回复
建议打包循环发送,稳定性高一点!
blairstar2
2011-10-28
打赏
举报
回复
刚刚做了一个小试验,发送80K的数据,用Send()函数发送一次就发送出去了,返回发送字符数81922,但在接端使用Recv()接收,分四次接收,第一次27740,第二次27740,第三次14600,第四次11842。大家能帮忙解释解释吗?《TCPIP详解卷一》说最大报文段(MSS)为1024,即传往另外一端的最大数据长度为1024,怎么解释这两者之间关系呢?
blairstar2
2011-10-28
打赏
举报
回复
[Quote=引用 14 楼 chenjintaoxp 的回复:]
缓存区大小可以自己任意设定,只要你内容允许。send()多少数据,并不保证把缓存的数据一次发送,这取决你的网络,肯能会分好几次,recv也是这样的。
[/Quote]
但我的确只是调用一次send()函数,就发送出去了,返回值为81922,但在接收端却是分四次接收,第一次27740,第二次27740,第三次14600,第四次11842,这应该怎么解释呢?
96掌门师兄
2011-10-28
打赏
举报
回复
缓冲区可以设置2M吧,
mpfishere
2011-10-28
打赏
举报
回复
70K一次发送不完,即便你的缓冲区设的比较大,一次传送也是有上限的,它会自动续传
fisher
2011-10-28
打赏
举报
回复
用一个更多点的多试试就知道了
学学你们
2011-10-28
打赏
举报
回复
Socket的缓冲区好像是可以设置为任意大小,70k小意思 可以一次性发过去
不行就试试嘛
feng2008519
2011-10-28
打赏
举报
回复
肯定不能一次性发完了,一点点的发送,直至全部发送完
ouyh12345
2011-10-28
打赏
举报
回复
设置这个缓冲区,不是说一次就能发送多少数据
这个是窗口,滑动窗口
请叫我涛哥0-0
2011-10-28
打赏
举报
回复
缓存区大小可以自己任意设定,只要你内容允许。send()多少数据,并不保证把缓存的数据一次发送,这取决你的网络,肯能会分好几次,recv也是这样的。
如何获取/
设置
socket
对应的内核
缓冲区
(发送 接收)的大小
本文探讨了如何使用Winsock API在TCP套接字上
设置
和获取内核
缓冲区
大小,展示了通过setsockopt和getsockopt函数操作SO_RCVBUF选项来调整接收
缓冲区
的过程。
linux
设置
套接字
缓冲区
的大小
本文介绍如何使用setsockopt函数调整
socket
的发送与接收
缓冲区
大小,并通过实例展示在Ubuntu系统中进行
设置
的方法及内核算法对
缓冲区
大小的影响。
socket
tcp
缓冲区
大小的默认值、最大值
本文详细解释了在Linux系统中如何
设置
TCP套接字的发送和接收
缓冲区
大小,并探讨了内核为何将
设置
值翻倍的原因。同时,文中还介绍了如何通过系统文件来调整这些
缓冲区
的默认值。
Socket
编程注意接收
缓冲区
大小
本文介绍了一种基于UDP协议的固件批量升级方案。针对文件较大的情况,将程序拆分为多个包顺序发送,确保数据完整性和一致性。通过调整接收
缓冲区
大小解决了批量升级过程中出现的问题,实现了对多台设备的有效管理。
(zt)
Socket
的 Send Recv 的长度问题
本文详细解析了TCP和UDP在网络编程中的应用差异,包括数据包大小、分片传输、
缓冲区
设置
及如何高效地进行数据收发等内容。
网络编程
18,356
社区成员
64,161
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章