Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!

А баг прост: send(somedata, somelen) возвращает <0 в случае ошибки, число байт, если отработало. И любмая ошибка всех начинающих сетевых разработчиков: send(somedata, somelen) может вернуть что-то МЕНЬШЕ, чем somelen — в буфер не влезло.
Поставьте на сервере буфер приема в 4 килобайта, на клиенте — буфер передачи в 4 килобайта, и попробуйте отправить 12 килобайт одним вызовом. В неблокирующем режиме обязана произойти эта самая операция partial write, независимо от платформы и используемой библиотеки.
import sys, socket, time
PORT = 1234
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 4 * 1024)
s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 4 * 1024)
if 'server' == sys.argv[1]:
s.bind(('', PORT))
s.listen(1)
conn, _ = s.accept()
print("connected")
time.sleep(-1)
if 'client' == sys.argv[1]:
s.connect((sys.argv[2], PORT))
s.setblocking(0)
ret = s.send('*' * 12 * 1024)
print("send() returned {0}".format(ret))
send() returned 6144root@network-server:~# uname -a
Linux network-server 3.2.0-4-686-pae #1 SMP Debian 3.2.51-1 i686 GNU/Linux
root@network-server:~# cat /etc/*release
PRETTY_NAME="Debian GNU/Linux 7 (wheezy)"
NAME="Debian GNU/Linux"
VERSION_ID="7"
VERSION="7 (wheezy)"
ID=debian
ANSI_COLOR="1;31"
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support/"
BUG_REPORT_URL="http://bugs.debian.org/"
if 'server' == sys.argv[1]:
s.bind(('', PORT))
s.listen(1)
conn, _ = s.accept()
print("connected")
time.sleep(100)
if 'client' == sys.argv[1]:
s.connect((sys.argv[2], PORT))
s.setblocking(0)
ret = 1707
while True:
ret = s.send('*' * 1707)
print ret
datacompboy@nuuzerpogodible:~/work/self/chinacambug$ python tester.py client localhost
1707
1707
1707
1707
682
Traceback (most recent call last):
File "tester.py", line 17, in <module>
ret = s.send('*' * 1707)
socket.error: [Errno 11] Resource temporarily unavailable
Китайские видеокамеры и TCP: баг или фича?