冰果

技术群:26678700     
交流QQ: 704839634
合作: 1) 可兼职远程办公开发; 2) 有一套Go+Python开发的行业短信云平台可合作;3)目前正在开发物联网、大数据平台。

还是要学习一点网络通讯的基本原理

         总会看到c++新手写网络通讯时,不理解recv()为什么阻塞或不阻塞,TCP数据顺序会不会乱,UDP会不会数据包不完整,都是对TCP/IP协议原理没有基本常识导致的。

         我曾看到代码,客户端recv(buf, 31), 实际服务器只会发送4个字节,客户端将永远阻塞,直到服务器主动close()为止。

开始时那个服务器是实现一请求一应答,答应后立即关闭,所以客户端没有事。

         后来服务器维护者,感觉要支持一个连接上支持一个或多个请求,就修改成等待客户端自己关闭或网络异常,服务器才关闭socket。这个修改看来是正常的,因为服务器一般写法都是被动关闭的,关闭权在客户端。可是这么一修改,原来那个客户端就阻塞死了,用户莫名其妙。

         这里有一个有趣现象:如果服务器维护者不修改,那么那个客户端软件一直是可以正常运行的,但从我们开发者角度来看,明明是一种实现错误,至少是缺陷吧。可是,测试人员黑盒测试是不可能测试出来的,一般测试人员也不会去写代码测试,所以这种问题测试组搞不定。

         很多时候,在测试环境里没问题,在真实环境就出现一些古怪的问题,其实问题不古怪。

         比如:A通过TCP向B发送1024字节,B采用一次性接收recv(buf, 1024), 测试环境常常每次都是一次收满,包是完整的;在真实环境,A和B在不同地域,之间不知道多少交换机和路由器,那可能就第一次只收到500字节,如果不加判断返回值乱处理,问题就出来了。

         这个问题还不止一次看到新手这么干。

posted on 2012-03-06 21:36 冰果 阅读(1862) 评论(4)  编辑 收藏 引用

评论

# re: 还是要学习一点网络通讯的基本原理 2012-03-07 09:24 winsock

我曾看到代码,客户端recv(buf, 31), 实际服务器只会发送4个字节,客户端将永远阻塞,直到服务器主动close()为止。

…………………………………………………………………………………………………………
不敢苟同这个啊。服务器就算发送1字节,recv(buf, 31)也会返回的。  回复  更多评论   

# re: 还是要学习一点网络通讯的基本原理 2012-03-07 09:50 flyliying

同意 winsock 的看法,会返回。不然这个recv怎么写?  回复  更多评论   

# re: 还是要学习一点网络通讯的基本原理 2012-03-07 12:44 核子

我也认为你说的recv有问题  回复  更多评论   

# re: 还是要学习一点网络通讯的基本原理[未登录] 2012-03-07 15:41 ithaca

@winsock

嗯,
若:
客户端recv(buf, 31), 实际服务器只会发送4个字节
则:
客户端不会阻塞,recv返回4,
这时:
看你应用程序的行为了。

博主的意思是大概是通过判断recv(buf, 31)的返回值为4,知道不收够31字节就再接着recv,如果是阻塞通讯,客户端就会卡这里了。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理