python无法立即完成一个非阻止性套接字操作

>>>importsocket>>>s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)>>>s.connect(('ww... >>> import socket
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> s.connect(('www.baidu.com',80))
>>> s.setblocking(0)
>>> s.send(b'GET / HTTP/1.1\n\n')
16
>>> str=data=s.recv(1)
>>> while data:
data=s.recv(1)
str+=data

Traceback (most recent call last):
File "<pyshell#17>", line 2, in <module>
data=s.recv(1)
socket.error: [Errno 10035] 无法立即完成一个非阻止性套接字操作。

顺便问一句,由于python等式没返回值又不支持do while
>>> str=data=s.recv(1)
>>> while data:
data=s.recv(1)
str+=data
这里很别扭,有什么方法好看一些吗?
展开
 我来答
passepartoute
2011-09-03 · TA获得超过376个赞
知道小有建树答主
回答量:289
采纳率:100%
帮助的人:260万
展开全部
你使用了非阻塞模式,而10035表示数据还没有返回给你。
你可以在接收前先select一下,如果有数据就接受,没有就跳过。
你可参考python官方文档
http://docs.python.org/howto/sockets.html
里面有Non-blocking Sockets的一章可以看看。

import select
...
while 1:
infds,outfds,errfds = select.select([s,],[],[],5)
if len(infds) >0:
....
else:
print "no data coming"
ttvast
推荐于2017-11-24 · TA获得超过374个赞
知道小有建树答主
回答量:253
采纳率:75%
帮助的人:134万
展开全部
设置了non-block模式后, recv如果无法接受到数据, 就会报异常. 这个和C下返回EAGAIN的道理是一样的。
你只要加上try...except来判断就可以了
str=s.recv(1)
while 1:
try:
data=s.recv(1)
except:
# sleep
continue
if len(data)==0:
break
str+=data
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lqefn
2011-09-01 · TA获得超过2655个赞
知道小有建树答主
回答量:3345
采纳率:0%
帮助的人:1725万
展开全部
这里要改为s.send(b'GET / HTTP/1.1\r\n\r\n')
设置超时就没有异常了
s.settimeout(1)
更多追问追答
追问
没用,他报的是recv()异常,跟send()有啥关系?
追答
调了settimeout就没有那个异常了,你那个send发的数据格式是错的,不可能收到东西。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式