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
这里很别扭,有什么方法好看一些吗? 展开
>>> 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
这里很别扭,有什么方法好看一些吗? 展开
展开全部
你使用了非阻塞模式,而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"
你可以在接收前先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"
展开全部
设置了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
你只要加上try...except来判断就可以了
str=s.recv(1)
while 1:
try:
data=s.recv(1)
except:
# sleep
continue
if len(data)==0:
break
str+=data
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这里要改为s.send(b'GET / HTTP/1.1\r\n\r\n')
设置超时就没有异常了
s.settimeout(1)
设置超时就没有异常了
s.settimeout(1)
更多追问追答
追问
没用,他报的是recv()异常,跟send()有啥关系?
追答
调了settimeout就没有那个异常了,你那个send发的数据格式是错的,不可能收到东西。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询