[win]socket ECONNRESET при recvfrom для SOCK_DGRAM(UDP)

Phoenix

под виндой:

F:\igor\apps\devel\python\socket\timetest>python timeupd.py test_recv
test_recv
('0.0.0.0', 3966)
> [Errno 10035] A non-blocking socket operation could not be completed immediately
>> 10035
>>> WSAEWOULDBLOCK
> [Errno 10054] An existing connection was forcibly closed by the remote host
>> 10054
>>> WSAECONNRESET

> [Errno 10035] A non-blocking socket operation could not be completed immediately
>> 10035
>>> WSAEWOULDBLOCK
> [Errno 10035] A non-blocking socket operation could not be completed immediately
>> 10035
>>> WSAEWOULDBLOCK
> [Errno 10035] A non-blocking socket operation could not be completed immediately
>> 10035
>>> WSAEWOULDBLOCK
> [Errno 10035] A non-blocking socket operation could not be completed immediately
>> 10035
>>> WSAEWOULDBLOCK
> [Errno 10035] A non-blocking socket operation could not be completed immediately
>> 10035
>>> WSAEWOULDBLOCK
> [Errno 10035] A non-blocking socket operation could not be completed immediately
>> 10035
>>> WSAEWOULDBLOCK
> [Errno 10035] A non-blocking socket operation could not be completed immediately
>> 10035
>>> WSAEWOULDBLOCK
> [Errno 10035] A non-blocking socket operation could not be completed immediately
>> 10035
>>> WSAEWOULDBLOCK

если убрать строку с sendto, то ECONNRESET не вылезает (!).
на freebsd 8 EAGAIN

> [Errno 35] Resource temporarily unavailable
>> 35
>>> EAGAIN
> [Errno 35] Resource temporarily unavailable
>> 35
>>> EAGAIN
> [Errno 35] Resource temporarily unavailable
>> 35
>>> EAGAIN
> [Errno 35] Resource temporarily unavailable
>> 35
>>> EAGAIN

Это специфическое поведение винды? или я что-то не так делаю. Может какой-то интеллектуальный метод определения, доставилось ли сообщение.

#-*- coding:utf-8 -*- 

import socket
import time
import sys
import errno


MAX_TO_READ = 2048

def test_recv(lhost= '0.0.0.0', lport = 0):

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(0)

#sock.bind('0.0.0.0'
sock.bindlhost, lport
print sock.getsockname
sock.sendto('HELLO %d' % (lport ('127.0.0.1', 12345
res = '***'
for i in range(10):
try:
res, src = sock.recvfrom(MAX_TO_READ)
except socket.error, e:
print '>',e
print '>>', e.errno
print '>>>', errno.errorcode[e.errno]
time.sleep(1)


if __name__ == '__main__':
test_recv

Andbar

WSAEWOULDBLOCK

This error is returned from operations on nonblocking sockets that cannot be completed immediately, for example recv when no data is queued to be read from the socket. It is a nonfatal error, and the operation should be retried later. It is normal for WSAEWOULDBLOCK to be reported as the result from calling connect on a nonblocking SOCK_STREAM socket, since some time must elapse for the connection to be established.

Соответственно, тебе надо выполнить sock.setblocking(1) перед чтением

Phoenix

WSAEWOULDBLOCK

К этому вопросов нет. Его я и хочу получать, если очередь пуста.
Вопрос к WSAECONNRESET.
Мне нужен неблокирующий сокет.
Оставить комментарий
Имя или ник:
Комментарий: