关于winsock的recv()函数

stoat 2008-08-05 05:15:30
前提:建立了一个TCP连接,并发出了请求,现在接收数据。使用winsock,不使用封装socket的类。

问题一:一个TCP包的大小大于系统缓存,这种情况会怎样?
比如:系统输入缓冲区(recv()从该系统缓冲中去数据)大小为1024字节,有一个1524字节的tcp包发了过来。会发生什么事?

问题二:程序中的缓存比较小。
比如:系统输入缓冲区大小为1024字节,程序中的缓存(recv()将数据读到该缓存中)只有300字节。有一个500字节的tcp包发了过来,并进入了系统缓存。接着,recv()从系统缓存中读300字节的数据到程序缓存中,并将这些数据从系统缓存中删除,系统缓存中就剩下200字节的数据。这时,又来了一个500字节的tcp包,这个包会进入系统缓存么?此时调用recv()会将700字节(200+500)的数据一起读入程序缓存么?还是先读200字节,再次调用recv()时才读剩下的500字节。
...全文
408 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
thirddata 2008-08-06
  • 打赏
  • 举报
回复
要知道tcp是基于流的,基于流,就是你这边发多少,那边收多少,系统缓存跟你的应用程序一点关系没哟
udp是基于消息的,这个倒是有关系,如果你发的包大小大于你的线路最大udp包大小,这超过的那部分就会被断掉。
草帽 2008-08-06
  • 打赏
  • 举报
回复
问题一:系统缓冲区是由系统自定,一般不会小于tcp包。
问题二:recv()函数中指定的buff小于一次接受的tcp数据包大小,
则系统会再次触发FD_READ事件,表示系统input buffer有数据可读。
至于对于不同tcp数据包的管理是系统的事,有兴趣可以看看windows原理.
Crob 2008-08-05
  • 打赏
  • 举报
回复
你所指的缓冲就是TCP的发送、接收窗口的大小吧。
据我所知,如果recv的缓冲小于send过来的字节,只要再recv就可以了,tcp协议会有同步机制,对方的接收窗口填满了就不会再send。

具体的你要去研究TCP/IP协议的三卷书了。

但是我觉得你不必担心你所提出的那些问题,应该不会发生。
stoat 2008-08-05
  • 打赏
  • 举报
回复
上面所说的系统输入缓冲区指的是,socket的接受缓冲区,由系统(或socket内部的代码)维护。

getsockopt()和setsockopt()可以对该缓冲区进行查询和设置。

recv()函数将该接受缓冲区的数据读到程序中由我们设置的缓冲内存中。在没用使用MSG_PEEK标志调用recv()的情况下,recv会将已被读取的数据从系统(或socket内部的代码)维护的接收缓存中删除。

可能是我没有表达清楚“系统输入缓冲区”指的是什么,请crob再看下我的问题!
Crob 2008-08-05
  • 打赏
  • 举报
回复
问题一,你所指的系统缓存是什么东东?
TCP的缓冲和什么系统缓冲没什么关系。如果每次recv只有1024,那需要recv两次才可recv到所有1524辽字节。第一次recv到1024个字节,第二次recv到500个字节。

问题二,你所指的系统输入缓冲区是什么东东?
同上

楼主用不着把问题想得这么复杂。

18,356

社区成员

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

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