各位看官,看这两段代码是否等效

yinyu 2000-07-20 02:05:00
//代码1
char cSendBuf[2000];
send(sock,cSendBuf,2000,0);

//代码2
char cSendBuf[2000];
send(sock,cSendBuf,1000,0);
send(sock,cSendBuf+1000,1000,0);

---------------------------------------------------------
那么在接收端看来是否会有什么区别呢?采用的是面向连接的TCP协议
...全文
108 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mach 2000-07-20
  • 打赏
  • 举报
回复
要看接收方的的设置了,如果接收方用read来读(假设是UNIX系统),如果接收方用ioctl设置过socketfd的VMIN和VTIME值的话,就不一定了,分四种情况:
1.VMIN==0,VTIME=0
这时问题中的两种发法的结果是不一样的,要read两次才能读到那两包数据
2.VMIN>0,VTIME=0
这时接收方能够一次接收到那两次数据
3.VMIN=0,VTIME>0
这时接收方可能在VTIME到时之后再没有接受到数据的情况下返回
4.VMIN>0,VTIME>0
这时能否一次读出那两包数据,取决于他们是否能在VTIME规定的时间内到达
所以最稳妥的方法是在接受方判断读到的字节数,以此来决定是否需要读下一包
WHQ 2000-07-20
  • 打赏
  • 举报
回复
可以认为没有区别,TCP数据没有边界
packager 2000-07-20
  • 打赏
  • 举报
回复
我对这个问题也不大明白,不过我觉得这两种写法对接收方应该还是有区别的,不过效果应该是一样的(当然接收方的接收数据代码也应该不同,要对应设置)。首先代码2中两次发出的数据包应该都是各自独立的,而且它们到达接收方的顺序也不一定就是和发送顺序一样。发送方发出两个数据包,对接收方来说,会引发两次数据包到达的消息,而代码1的写法只会引发一次。
不知我的理解是否正确?
zzh 2000-07-20
  • 打赏
  • 举报
回复
其实,正确的应该为Send(sock,cSendBuf,1000,0),Send(sock,cSendBuf+1000*sizeof(char),1000,0);
只要在发送方保证把所有字符发送出去,而且顺序正确的话,在接收方是没有任何区别的,因为,Recv每一次接收的并不一定就是发送的个数,所以,一般的处理方法是加入自己的包头和包尾,这样就可以判断了。

4,354

社区成员

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

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