阻塞read/write型socket网络连接弊端——缓冲区堆积——linux网络编程学习

情景:

自定义协议:有头无尾,数据中可计算长度。

采用阻塞read/write发送接收。


测试代码:

接收端主要部分截图,在read()之间加sleep即可:

注意事项:如果双工,接收端发送反馈的write最好别再sleep之后,不然有干扰。(好像是共用缓冲区,暂时不测)




发送端主要部分截图,write()之间间隔小于read()即可:


实测结果:

152是4个38


遇到问题:

当发送快于接收,缓冲区堆积,一次read多个自定义协议包。字符串处理肯定就粘连了,但此处是自定义协议,所以能够精确找到数据并读取。

但是多接收的数据就浪费了,如果比较关键就麻烦了。


解决方法:

对比read返回值与数据包长度,长度不等则额外处理。





其他方法:换机制等,select,epoll



警示:

不要轻易利用read()返回值确定位置,能计算协议包长度最好和read()返回值对比,提早发现可能的漏洞











你可能感兴趣的:(阻塞read/write型socket网络连接弊端——缓冲区堆积——linux网络编程学习)