关于发送、接收缓冲区的问题

screen12 2016-05-17 09:39:11
客户端好办。将发送、接收缓冲区设得大一点,比如20M(可以吗?),这样就解决了传大数据的要求。

可是服务器端,要与成千上万个客户端通信,与每一个客户端都有一个TCP连接。如果每个Socket都设为20M缓冲区,那整个内存肯定不够。

可是我的程序,绝大部分时间,都是小数据通信。偶尔有大数据(比如传图片,视频、文件等等)。怎么办?

我想到的一种办法有这样几个,哪个可行?

一、还是在服务器端把每个TCP套接字缓冲区设为比较大(比如20M),虽然有成千上万个套接字。但每个缓冲区其实只是分配了地址空间,并没有物理内存被分配。所以内存仍然不会太紧张。只有在某个套接字要接受(或发送)较大数据时,才用到较多的缓冲区,才真正分配较多的物理内存。发送完,这些内在就可以重新被别的套接字缓冲区使用。

二、只在需要发送(或接收)大数据时,才把发送缓冲区(接收缓冲区)设得较大,完成后,重新把缓冲区设小(8K)。

三、只使用系统默认的8K小缓冲区。但是在程序里循环发送(或接收)。

三种方法哪个可行?
...全文
1128 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
哥们,你这个问题我也在研究,加个QQ:280604597
qinlj0 2016-05-18
  • 打赏
  • 举报
回复
引用 6 楼 qinlj0 的回复:
目前的802.11n网卡多数是8M*4(发送)/8M*4(接收)。
也就是MTU是8M字节(IP头和Payload加在一起不能超过8M字节)。 IPv5不再支持自动分片。
qinlj0 2016-05-18
  • 打赏
  • 举报
回复
如果用IPv5的话(包括IPv5 Extension1),所有缓冲区都在网卡硬件上,Send函数阻塞,直到网络帧Copy到网卡缓存上返回。 目前的802.11n网卡多数是8M*4(发送)/8M*4(接收)。 如果用NT6核心的话,还支持Write-Through模式,Send函数阻塞,直到网络帧发送到线缆上返回。 具体文档在NT6 SDK中有,只是目前大宇宙中还没有扩散,U2中有。
赵4老师 2016-05-18
  • 打赏
  • 举报
回复
这个手势表示三是OK的。
微型蚂蚁 2016-05-17
  • 打赏
  • 举报
回复
最后一个。一次发送20M实际上也是会被分成很多个小的片段发给你,所以在接收的时候使用大的缓存区没有什么好处,反而浪费了内存。 所以接收的时候用小缓冲比如你说的8K,然后按照次序组装起来形成大数据。内存在申请的时候可以使用缓冲池循环使用,提高效率。
_船长_ 2016-05-17
  • 打赏
  • 举报
回复
发送缓冲区的设置,可以提高网络的吞吐率,建议大小为带宽时延积(但windows系统应该会有一个上限值和下限值),但需要通信双方共同来协商调整,
Eleven 2016-05-17
  • 打赏
  • 举报
回复
发送文件可以试试MS的扩展函数TransmitPackets/TransmitFile

18,356

社区成员

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

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