I am using c sockets to implement a reliable UDP protocol. I am using the following code to set a timeout on a socket in which I’m waiting for an acknowledgement. I am not sure why I am getting errno 11, resource temporarily unavailable.
//set timer for recv_socket
struct timeval tv;
tv.tv_usec = TIMEOUT_MS;
if(setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0){
printf("Error setting the socket timeout.n");
}
int recv_msg_len;
if(recv_msg_len = recvfrom(rcv_sock, ackBuffer,sizeof(ackBuffer), 0,
(struct sockaddr *) &servAddr2, &fromSize) < 0){
//timeout reached
printf("Error Reporting: %d : %sn", errno, strerror(errno));
num_timeouts++;
}
I have also tried the select method that was mentioned in the comments. I have the following code inside a loop, but the recvfrom never times out.
fd_set set;
FD_ZERO(&set); /* empties the set */
FD_CLR(rcv_sock,&set); /* removes FD from the set */
FD_SET(rcv_sock,&set); /* adds FD to the set */
if(select(rcv_sock + 1, &set, NULL, NULL, &tv) < 0){
printf("nError Reporting: %d : %snn", errno, strerror(errno));
return -1;
}
if(!FD_ISSET(rcv_sock,&set)){ /* true if FD is in the set */
printf("socket is not set properly.n");
}
I want to make a program that accesses images from files, encodes them, and sends them to an server.
Than the server is supposed to decode the image, and save it to file.
I tested the image encoding itself, and it worked, so the problem lies in the server and client connection.
Here is the server:
import socket
import errno
import base64
from PIL import Image
import StringIO
def connect(c):
try:
image = c.recv(8192)
return image
except IOError as e:
if e.errno == errno.EWOULDBLOCK:
connect(c)
def Main():
host = '138.106.180.21'
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((host, port))
s.listen(1)
while True:
c, addr = s.accept()
c.setblocking(0)
print "Connection from: " + str(addr)
image = c.recv(8192)#connect(c)
imgname = 'test.png'
fh = open(imgname, "wb")
if image == 'cusdom_image':
with open('images.png', "rb") as imageFile:
image = ''
image = base64.b64encode(imageFile.read())
print image
fh.write(image.decode('base64'))
fh.close()
if __name__ == '__main__':
Main()
And here is the client:
import socket
import base64
from PIL import Image
import StringIO
import os, sys
ip = '138.106.180.21'
port = 12345
print 'Add event executed'
s = socket.socket()
s.connect((ip, port))
image_path = '/home/gilgamesch/Bilder/Bildschirmfoto.png'
print os.getcwd()
olddir = os.getcwd()
os.chdir('/')
print os.getcwd()
if image_path != '':
with open(image_path, "rb") as imageFile:
image_data = base64.b64encode(imageFile.read())
print 'open worked'
else:
image_data = 'cusdom_image'
os.chdir(olddir)
s.send(image_data)
s.close()
And the error message is:
Traceback (most recent call last):
File "imgserv.py", line 49, in <module>
Main()
File "imgserv.py", line 34, in Main
image = c.recv(8192)#connect(c)
socket.error: [Errno 11] Resource temporarily unavailable
Я хочу сделать программу, которая обращается к изображениям из файлов, кодирует их и отправляет их на сервер. Чем сервер должен декодировать изображение и сохранить его в файл. Я сам тестировал кодировку изображений, и она работала, поэтому проблема заключается в подключении к серверу и клиенту.
Вот сервер:
import socket
import errno
import base64
from PIL import Image
import StringIO
def connect(c):
try:
image = c.recv(8192)
return image
except IOError as e:
if e.errno == errno.EWOULDBLOCK:
connect(c)
def Main():
host = '138.106.180.21'
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((host, port))
s.listen(1)
while True:
c, addr = s.accept()
c.setblocking(0)
print "Connection from: " + str(addr)
image = c.recv(8192)#connect(c)
imgname = 'test.png'
fh = open(imgname, "wb")
if image == 'cusdom_image':
with open('images.png', "rb") as imageFile:
image = ''
image = base64.b64encode(imageFile.read())
print image
fh.write(image.decode('base64'))
fh.close()
if __name__ == '__main__':
Main()
И вот клиент:
import socket
import base64
from PIL import Image
import StringIO
import os, sys
ip = '138.106.180.21'
port = 12345
print 'Add event executed'
s = socket.socket()
s.connect((ip, port))
image_path = '/home/gilgamesch/Bilder/Bildschirmfoto.png'
print os.getcwd()
olddir = os.getcwd()
os.chdir('/')
print os.getcwd()
if image_path != '':
with open(image_path, "rb") as imageFile:
image_data = base64.b64encode(imageFile.read())
print 'open worked'
else:
image_data = 'cusdom_image'
os.chdir(olddir)
s.send(image_data)
s.close()
И сообщение об ошибке:
Traceback (most recent call last):
File "imgserv.py", line 49, in <module>
Main()
File "imgserv.py", line 34, in Main
image = c.recv(8192)#connect(c)
socket.error: [Errno 11] Resource temporarily unavailable
Доброго времени, суток.
Обнаружил вот какую проблему.
Если я сейчас выну сетевой кабель из сетевой карты, то, хотя никакой сети уже не будет, все приложения, которые используют постоянное подключение, будут считать, что сеть работает. К примеру, jabber клиенты остаются подключенными к серверу, и когда я пытаюсь отослать кому-нибудь сообщение, никаких ошибок не возникает, и всё указывает на то, что сообщение отправлено, хотя, естественно, оно никак не может быть отправлено.
Если же вставить кабель обратно, то ничего не изменится — сеть работать все равно не будет, а приложения будут думать, что она работает.
Пробовал запускать /etc/init.d/networking restart и заново поднимать VPN соединение — сеть начинает работать, но те приложения, которые используют постоянное подключение, до сих пор не работают. А именно, они считают, что все нормально работает, а на самом не отсылают в сеть и байта информации. В случае jabber клиента это исправляется путем ухода в offline, а потом обратно в online (т. е. как раз этими действиями я закрываю постоянное TCP соединение и открываю новое).
В данном примере я сам выдергиваю сетевой кабель, но если неполадки в сети случились не по моей вине, то я никак не замечаю, что сеть не работает, и отправляю сообщения через jabber, которые не доходят до получателя, не подозревая об этом.
Данная проблема наблюдается как при работе в интернет по VPN соединению, так и в локальной сети.
Подскажите, пожалуйста, в какую сторону копать. Совершенно невозможно работать с IM клиентами — нет никакой гарантии, что сообщение дошло до получателя.
Буду очень благодарен за помощь.
Информация, которая на мой взгляд может помочь в решении проблемы:
Ubuntu 7.04 (обновлялся с 6.10), eth0 — сеть между двумя компьютерами дома, через нее по NAT’у второй компьютер выходит в интернет, eth1 — локальная городская сеть, ppp0 — VPN подключение, соединяющее меня с интернетом.
Ниже приведен вывод команды ifconfig до вынимания сетевого кабеля и после.
До:
Код:
eth0 Link encap:Ethernet HWaddr 00:0F:EA:2E:E5:8F
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:19 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:3703 (3.6 KiB)
Interrupt:19 Base address:0x4000
eth1 Link encap:Ethernet HWaddr 00:50:FC:F5:C6:DD
inet addr:10.100.43.13 Bcast:10.100.43.255 Mask:255.255.255.0
inet6 addr: fe80::250:fcff:fef5:c6dd/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:39898 errors:0 dropped:0 overruns:0 frame:0
TX packets:62556 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3288355 (3.1 MiB) TX bytes:77257457 (73.6 MiB)
Interrupt:21 Base address:0x4000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:20 errors:0 dropped:0 overruns:0 frame:0
TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1204 (1.1 KiB) TX bytes:1204 (1.1 KiB)
ppp0 Link encap:Point-to-Point Protocol
inet addr:192.168.85.222 P-t-P:172.16.16.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:9920 errors:0 dropped:0 overruns:0 frame:0
TX packets:14299 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:669641 (653.9 KiB) TX bytes:9848957 (9.3 MiB)
После:
Код:
eth0 Link encap:Ethernet HWaddr 00:0F:EA:2E:E5:8F
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:35 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:5660 (5.5 KiB)
Interrupt:16 Base address:0xe000
eth1 Link encap:Ethernet HWaddr 00:50:FC:F5:C6:DD
inet6 addr: fe80::250:fcff:fef5:c6dd/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4449 errors:0 dropped:0 overruns:0 frame:0
TX packets:5021 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:515277 (503.2 KiB) TX bytes:2812167 (2.6 MiB)
Interrupt:21 Base address:0x6000
eth0:avah Link encap:Ethernet HWaddr 00:0F:EA:2E:E5:8F
inet addr:169.254.8.205 Bcast:169.254.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:16 Base address:0xe000
eth1:avah Link encap:Ethernet HWaddr 00:50:FC:F5:C6:DD
inet addr:169.254.12.145 Bcast:169.254.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:21 Base address:0x6000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:20 errors:0 dropped:0 overruns:0 frame:0
TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1204 (1.1 KiB) TX bytes:1204 (1.1 KiB)
my system: ubuntu16.04; PyCharm; python2.7.12; virtualenv;
when test sctp connect, this error occurred to me:
Traceback (most recent call last): File "/home/test/Downloads/pycharm-community-2017.1.1/helpers/pydev/pydevd.py", line 1578, in <module> globals = debugger.run(setup['file'], None, None, is_module) File "/home/test/Downloads/pycharm-community-2017.1.1/helpers/pydev/pydevd.py", line 1015, in run pydev_imports.execfile(file, globals, locals) # execute the script File "/home/test/PycharmProjects/sctp_socket/server.py", line 215, in <module> someone access: ('127.0.0.1', 50750) fromaddr, flags, msg, notif = conn_sock.sctp_recv(BUFSIZE) File "/home/test/sctp_env/local/lib/python2.7/site-packages/sctp.py", line 1206, in sctp_recv (fromaddr, flags, msg, _notif) = _sctp.sctp_recv_msg(self._sk.fileno(), maxlen) IOError: [Errno 11] Resource temporarily unavailable
but it’s OK in terminal:
(sctp_env) test@ubuntu:~/PycharmProjects/sctp_socket$ python server.py
my server code:
import sctp HOST = '' PORT = 3868 BUFSIZE = 2048 ADDR = (HOST, PORT) socket_serv = sctp.sctpsocket_tcp(socket.AF_INET) # , sctp.IPPROTO_SCTP socket_serv.initparams.max_instreams = 3 socket_serv.initparams.num_ostreams = 3 socket_serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) socket_serv.bindx([ADDR]) socket_serv.listen(5) socket_serv.setblocking(1) socket_serv.events.data_io = 1 socket_serv.events.clear() while True: conn_sock, addr = socket_serv.accept() print 'someone access: ', addr msg = '' while True: fromaddr, flags, msg, notif = conn_sock.sctp_recv(BUFSIZE) if not msg: print 'msg == 0!!' break print 'recv: %s' % msg conn_sock.close() socket_serv.close()
client.py:
import sctp from sctp import * server = "localhost" tcpport = 3868 if _sctp.getconstant("IPPROTO_SCTP") != 132: raise "getconstant failed" client_sock = sctpsocket(socket.AF_INET, socket.SOCK_STREAM, None) saddr = (server, tcpport) client_sock.initparams.max_instreams = 3 client_sock.initparams.num_ostreams = 3 client_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) client_sock.setblocking(0) client_sock.events.clear() client_sock.events.data_io = 1 client_sock.connect(saddr) while 1: while True: data = raw_input('INPUT: ') if not data: break client_sock.sctp_send(data) fromaddr, flags, msg, notif = client_sock.sctp_recv(1024) print "%s____" % msg break client_sock.close()
Error occurred in line: fromaddr, flags, msg, notif = conn_sock.sctp_recv(BUFSIZE)
please tell me why does this Error come out…THX
0
0
При чтении из СОМ порта read() возрщает ошибку, errno=11 Что это значит?
что значит errno=11 ? В каком мануале расписаны коды ошибок?
- Ссылка


Re: Чтение СОМ порта… errno=11
EAGAIN устройство не готово к выводу. Видимо еще данных нет.
- Показать ответ
- Ссылка
![]()
![]()
Re: Чтение СОМ порта… errno=11
в каком *.h файле расписаный коды ошибок?
binr ★★
(26.02.06 14:29:25 MSK)
- Показать ответ
- Ссылка


![]()
Re: Чтение СОМ порта… errno=11
к коду 11 соответсвует коментарий try again, что бы это значило по отношению к драйверу СОМ порта? Почему я такого не встречал в qnx?
binr ★★
(26.02.06 14:36:39 MSK)
- Ссылка
![]()
Re: Чтение СОМ порта… errno=11
Да, видимо нет данных…
binr ★★
(26.02.06 14:38:39 MSK)
- Ссылка
![]()
Re: Чтение СОМ порта… errno=11
Интиересно, с чем связано, что read() не возращает 0, плчему надо смотреть по коду ошибки 11……
binr ★★
(26.02.06 14:56:31 MSK)
- Показать ответ
- Ссылка

Re: Чтение СОМ порта… errno=11
man 2 read на тему O_NONBLOCK
- Ссылка
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
(in continuation to bug https://bugs.python.org/issue25471 )
socket.recv() raises 'BlockingIOError: [Errno 11] Resource temporarily unavailable' in case, if setblocking(False) on socket returned by non-blocking socket's .accept() method and client does not sending data and didn't disconnected yet.
Not sure if I'm correct, but reading glibc doc on recv(), I think raised exception should be corrected: while code 11 correctly corresponds to EWOULDBLOCK, the misleading description 'Resource temporarily unavailable', probably, should be changed:
---
'EWOULDBLOCK'
Nonblocking mode has been set on the socket, and the read
operation would block. (Normally, 'recv' blocks until there
is input available to be read.)
---
attached file with testing server corrected for this issue
This is simply the way glibc defines the error messages. % python3 Python 3.4.3 (default, Sep 27 2015, 15:15:25) [GCC 4.8.5] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import errno, os >>> errno.EAGAIN, errno.EWOULDBLOCK (11, 11) >>> os.strerror(errno.EAGAIN) 'Resource temporarily unavailable'
sock.setblocking(0)
try:
data = sock.recv(1024)
except socket.error, e:
if e.args[0] == errno.EWOULDBLOCK:
print 'EWOULDBLOCK'
else:
if not data: #recv over
sock.close()
print 'close================='
else:
print 'recv ---data---------'
poem += data
all above code is in a loop.using non-blocking socket(just want to test ‘non-blocking socket’) to get data. But always print ‘EWOULDBLOCK’,i don’t know why?
asked Jul 25, 2012 at 9:48
zhenyuyangzhenyuyang
1511 gold badge1 silver badge10 bronze badges
2
The socket is non-blocking so recv() will raise an exception if there is no data to read. Note that errno.EWOULDBLOCK = errno.EAGAIN = 11. This is Python’s (well the OS really) way of telling you to try the recv() again later.
I note that you close the socket each time you get this exception. That’s not going to help at all. Your code should be something like this:
import socket, errno, time
sock = socket.socket()
sock.connect(('hostname', 1234))
sock.setblocking(0)
while True:
try:
data = sock.recv(1024)
if not data:
print "connection closed"
sock.close()
break
else:
print "Received %d bytes: '%s'" % (len(data), data)
except socket.error, e:
if e.args[0] == errno.EWOULDBLOCK:
print 'EWOULDBLOCK'
time.sleep(1) # short delay, no tight loops
else:
print e
break
For this sort of thing, the select module is usually the way to go.
answered Jul 25, 2012 at 12:10
mhawkemhawke
83k9 gold badges114 silver badges135 bronze badges
6
The exception is raised by design, cause you are using non-blocking IO.
The major mechanical difference is that send, recv, connect and accept can return without having done anything. You have (of course) a number of choices. You can check return code and error codes and generally drive yourself crazy.
Quoted from Python doc
If you run man errno 3, you shall see the description of EWOULDBLOCK. The exception is reasonable, because there is no data to read yet.
answered Jul 25, 2012 at 11:52
xiaowlxiaowl
5,1273 gold badges27 silver badges28 bronze badges