data=b''
while True:
data+=socket.recv(4096)
if len(data)<=0:
break
我是用循环来实现的,但是会阻塞.
用 setblocking(0),然后又会好像老是出现 reset by peers 。
求 v2 菊苣们指点啊
@_@
1
loqixh 2015-11-15 13:35:03 +08:00
你这几句代码有 N 个错误。。。。你最好先弄本网络编程的基础书看看
|
2
auser 2015-11-15 13:42:41 +08:00 via Android
1 楼说的对
|
5
eamars 2015-11-15 14:08:49 +08:00
@wowpanda
你在接受了 4096 个数据之后直接添加到了 data 中,而 socket 并没有保证本次接受可以成功,如果产生了错误,比如网络中断,或者出现了 reset by peer ,则 socket 很有可能返回一个 None ,或者别的神奇的数据,这时候 data += None 是什么鬼? 然后你的 data 每次是 append 的,所以只要有任意一次数据传输成功, if len(data)<=0 就永远为 false 好好读书 |
6
mengzhuo 2015-11-15 14:12:35 +08:00
同意 1 楼观点,先看看书吧
给你点提示,阻塞有时候并不是坏事, setblocking 会触发 EAGAIN 你的代码 exception 没有处理,自然程序 crash , crash 之后操作系统会回收你的 socket ,对端自然会 reset 了 |
8
ryd994 2015-11-16 02:49:32 +08:00 via Android
block=recv
if block: data+block else: break 这样就行了 non blocking 不是你这样用的 |
9
wowpanda OP @ryd994 不加循环,怎么知道是不是把数据都接受完整了呢? block 为空不能说明是接收完所有对端返回的数据吧了吧,如果是非阻塞,是不是要设置个超时?或者先接收一部分把 header 里面的 content length 给解析出来,再设置为 recv 的参数?
|
10
ryd994 2015-11-16 09:51:47 +08:00 via Android
@wowpanda 这当然是循环内的,不然也就没有 data+=block 了
非阻塞自然就不存在超时这个概念,系统 buffer 里有多少返回多少 recv 的参数不是给你指定接收长度用的而是防止溢出用的。如果你用 C 写过这方面的程序,就会明白这个道理。 |