socket缓冲区可以设置多大呢

blairstar2 2011-10-28 09:40:31
大家好,小弟最近在学习网络编程,因为在做一个小实验,需要把80K大的数据发送给另一方,当我在使用setsockopt()设置缓冲区的大小时,居然在设置到1024*1024时,也没返回SOCKET_ERROR,所以心里有点疑问,Socket的缓冲区是不是可以设置为任意大小呢?另外,如果缓冲区设置很大,如80*1024,那使用Send()一次性发送70K的数据,能够一次性就发送出去吗?
谢谢大家!
...全文
6055 16 打赏 收藏 转发到动态 举报
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也是这样的。

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧