会不会出现这种情况?

colorrain 2002-12-17 04:33:00
服务器程序调用一次send,而客户端程序却要调用多次recv?
...全文
23 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
colorrain 2002-12-18
  • 打赏
  • 举报
回复
怎么没法给分?
colorrain 2002-12-18
  • 打赏
  • 举报
回复
多谢imquestion和木易指点,结贴
imquestion 2002-12-18
  • 打赏
  • 举报
回复
另一条了解这个问题的路是读tcp/ip的源码。
最好做一下这个试验:
客户端发8000数据,
服务器端照wwwunix(木易) 说的收,
int n,x;
n=8000;
while (n>0) {
x=recv(s,buf,8000,0);
if(x<8000)printf("唉唉唉\n");
n=n-x;
}
看是否能总能一次收完。
这不能在一台机子上试。
多试几次,如果有一次出现了收多次才收完,
我们想知道的问题就有答案了。
imquestion 2002-12-18
  • 打赏
  • 举报
回复
单说send(s,"hello word",11,0);的话,是不会出现两次才读完的情况。
因为很小,只有11个字节。肯定是在同一个ip包中传输。要收到就都收到,要收不到就都收不到。
但是我想你想要了解的是大量数据的话,能否出现那种情况。
上面举得那个例子,应该可以比较好的说明,我没自己试,
可以调整Sleep的时间看看会有什么不同。
一个send中间,如果传输大量数据,这些数据中间是有可能有间断吧,
ip数据是有可能丢失的,然后重传,可能是会花些时间。
imquestion 2002-12-18
  • 打赏
  • 举报
回复
是有可能的,前面其实已经很明显了。
看这个例子,
send(s,"hello",5,0);
Sleep(100);
send(s," world",6,0);
你试试看,recv是怎么收的。
这个实际上是在模拟send(s,"hello world",11,0)过程中由于一些情况出现的短暂的数据没传到的情况。下面另说。
colorrain 2002-12-18
  • 打赏
  • 举报
回复
继续讨论:
服务器:send(s,"hello word",11,0);
客户端:
char buf[11];
recv(s,buf,11,0);
tcp 阻塞模式.这种情况下recv会不会先读到部分数据比如"hello",然后再次调用recv(s,buf,11,0)时他又读到" word"?
欢迎讨论..
imquestion 2002-12-17
  • 打赏
  • 举报
回复
有其他疑问就也提出来大家讨论,大家一起试,
最后大家都明白了,就好了。
imquestion 2002-12-17
  • 打赏
  • 举报
回复
好吧,还是作试验吧。
tcp程序两个server,client。
server在一个端口上的recv阻塞,recv中的len填256个字节,
recv操作之后,会有个printf("recv %s",...)。
client向这个server发数据"hello",明显不到256个字节。
如果recv收不到256个字节就不出来的话,我们就不会看到printf的内容,
因为客户端只发了"hello"不足256个字节。

试验结果:
server端打印了收到的内容,说明了在阻塞模式下recv收到内容不足参数
中给出的,也是会返回的。

如果要找一下具体过程的话,看源码,看系统是如何具体实现的。
wwwunix 2002-12-17
  • 打赏
  • 举报
回复
int n,x;
n=1000;
while (n>0) {
x=recv(s,buf,1000,0);
n=n-x;
}
wwwunix 2002-12-17
  • 打赏
  • 举报
回复
recv将返回接收到的字节数,它不一定等于1000
colorrain 2002-12-17
  • 打赏
  • 举报
回复
谢谢楼上!
tcp 协议 如果是阻塞模式下,send(s,buf,1000,0);recv(s,buf,1000,0)
会不会出现这种情况?
recv没有收到指定字节数据他会不会返回,不出现系统异常信号打断阻塞的情况,请指点.
imquestion 2002-12-17
  • 打赏
  • 举报
回复
当然有可能了。
如果是udp,发送一个消息,收到也是一个消息,即使缓冲区中已经有了好几个消息。
如果是tcp,发送的是字节流,收到的是字节流,
比如你发100字节,接收端先收20字节,再收10字节,再..
就是这样,字节流。

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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