不久之前,我曾经把Linux下Socket与windows下python socket自定义协议通信完成,但是后来使用过程中发现一些bug,当接收发送数据的缓冲区足够大时,python作为客户端接收数据,经常出现接收为空数据的情况,检查下Linux服务端,发现服务端是把数据已经发送出来的,但是Python socket的recv()就是偶尔出现接收不到数据的情况。
经过一番调试,后来找到原因,原来Python的socket.recv(n)函数,并没有真正将我们希望接收的数据字长n全部接收,只需要保证Python将我们希望接收的所有长度接收即可。那么根据需求,我们自己实现一个接收的函数即可:
#------------------------------------------------------
# RecvN
# recv N bytes to target
#------------------------------------------------------
def RecvN(socket, n):
totalContent = b''
totalRecved = 0
while totalRecved < n:
onceContent = socket.recv(n - totalRecved)
print("onceContent", onceContent)
totalContent += onceContent
totalRecved = len(totalContent)
return totalContent
# data = sockfd.recv(30 * 1024 + 14) data = RecvN(sockfd, 30 * 1024 + 14)
这样的话,就可以把我们所有需要接收的字长接收了。
参考:http://bbs.csdn.net/topics/390902011
http://stackoverflow.com/questions/27535543/c-socket-recv-not-receiving-correct-number-of-bytes
文章的脚注信息由WordPress的wp-posturl插件自动生成
微信扫一扫,打赏作者吧~![[整理]how to run flask with pyqt5](http://www.jyguagua.com/wp-content/themes/begin/timthumb.php?src=http://www.jyguagua.com/wp-content/uploads/2021/03/pyqt_flask.png&w=280&h=210&zc=1)
![[已解决]LINK : fatal error LNK1158: cannot run 'rc.exe' 错误的解决办法](http://www.jyguagua.com/wp-content/themes/begin/timthumb.php?src=http://www.jyguagua.com/wp-content/uploads/2021/02/Snipaste_2021-02-17_15-18-26-1024x505.png&w=280&h=210&zc=1)
![[已解决]Python扩展模块 error: Unable to find vcvarsall.bat](http://www.jyguagua.com/wp-content/themes/begin/timthumb.php?src=http://www.jyguagua.com/wp-content/uploads/2020/11/Snipaste_2020-11-19_10-01-38.png&w=280&h=210&zc=1)
![[整理]PyQt画圆,动态变色](http://www.jyguagua.com/wp-content/themes/begin/timthumb.php?src=http://www.jyguagua.com/wp-content/uploads/2020/08/drawCircle.gif&w=280&h=210&zc=1)