社区
网络编程
帖子详情
socket缓冲区可以设置多大呢
blairstar2
2011-10-28 09:40:31
大家好,小弟最近在学习网络编程,因为在做一个小实验,需要把80K大的数据发送给另一方,当我在使用setsockopt()设置缓冲区的大小时,居然在设置到1024*1024时,也没返回SOCKET_ERROR,所以心里有点疑问,Socket的缓冲区是不是可以设置为任意大小呢?另外,如果缓冲区设置很大,如80*1024,那使用Send()一次性发送70K的数据,能够一次性就发送出去吗?
谢谢大家!
...全文
6055
16
打赏
收藏
socket缓冲区可以设置多大呢
大家好,小弟最近在学习网络编程,因为在做一个小实验,需要把80K大的数据发送给另一方,当我在使用setsockopt()设置缓冲区的大小时,居然在设置到1024*1024时,也没返回SOCKET_ERROR,所以心里有点疑问,Socket的缓冲区是不是可以设置为任意大小呢?另外,如果缓冲区设置很大,如80*1024,那使用Send()一次性发送70K的数据,能够一次性就发送出去吗? 谢谢大家!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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,这应该怎么解释呢?
武汉元码科技
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
缓冲区
大小
发送数据时候先把数据发送到
socket
缓冲区
中,之后接受函数再从
缓冲区
中取数据,如果发送端特别快的时候,
缓冲区
很快就被填满(
socket
默认的是1024×8=8192字节),这时候我们应该根据情况
设置
缓冲区
的大小,可以通过setsockopt函数实现。optLen :指向
缓冲区
大小变量的长度。
socket
:传输数据的
socket
。SO_RCVBUF:接受数据的
缓冲区
。SOL_
SOCKET
:基本套接口。optVal:
缓冲区
大小。
linux
设置
socket
缓存大小,linux
socket
缓冲区
默认大小
1. tcp 收发
缓冲区
默认值[root@ www.linuxidc.com]# cat /proc/sys/net/ipv4/tcp_rmem4096 87380 416153687380 :tcp接收
缓冲区
的默认值[root@ www.linuxidc.com]# cat /proc/sys/net/ipv4/tcp_wmem4096 16384 416153616384...
java
socket
缓冲区
大小_
Socket
缓冲区
大小修改与系统
设置
每个
Socket
在Linux中都映射为一个文件,并与内核中两个
缓冲区
(读
缓冲区
、写
缓冲区
)相关联。或者说,每个
Socket
拥有两个内核
缓冲区
。有时,我们需要修改
缓冲区
的内核限制的最大值,使其符合我们的实际需求。一、系统
设置
[jiang@localhost ~]$ uname -aLinux localhost.localdomain 2.6.32-642.el6.x86_64 #1 SMP Tue...
设置
Socket
缓冲区
的大小
在32位的操作系统下,如果我没有记错的话:
socket
缓冲区
默认大小是8192B,但是有些时候我们在传输大文件的时候或者几十G的文件的时候我们想。MessageBox("获取服务端
设置
SOCKET
发送
缓冲区
大小失败");//
设置
系统发送数据为默认的倍数。MessageBox("
设置
SOCKET
发送
缓冲区
大小失败");这里我也是摘抄一个网友的博客,进行了修改。
socket
缓冲区
大小
设置
系统提供的
socket
缓冲区
大小为8K,你可以将之
设置
为64K,尤其在传输实时视频时。 //
设置
发送和接收
缓冲区
int rcvbuf; int rcvbufsize=sizeof(int); if(getsockopt(m_
Socket
,SOL_
SOCKET
,SO_RCVBUF,(char*) &rcvbuf,&rcvbufsize)!=
SOCKET
_ERROR) { if(rcvbuf
网络编程
18,363
社区成员
64,187
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章