Форум сайта python.su
Задача следующая:
Дождаться входящего соединения на определённом порту, разобрать бинарные данные, сформировать ответ, отправить обратно.
Соединения производятся раз в пять секунд, например.
Проблема: половина (каждый второй) ответ обрывается - в wireshark я вижу RST, ACK.
Код примерно такой:
import binascii import socket import struct import sys sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_address = ('10.10.10.10', 2001) sock.bind(server_address) sock.listen(1) unpacker = struct.Struct('>b b b b b b 6s 4s 4s h h h h h h h') packer = struct.Struct('>b b b b b b 6s 4s 4s h h h h h h h') while True: print >>sys.stderr, '\nwaiting for a connection' connection, client_address = sock.accept() try: data = connection.recv(unpacker.size) unpacked_data = unpacker.unpack(data) conf_arr = list(unpacked_data) conf_arr[3] = 1 # тут должно быть что-то более осмысленное packed_data = packer.pack(*conf_arr) connection.sendall(packed_data) finally: connection.close()
Офлайн
когда описывает проблему, не важно где, указывайте полный traceback ошибки
Офлайн
Нет ошибки со стороны питона, вот в чём дело. С моей стороны всё выглядит идеально.
Канал выглядит оборванным как будто бы со стороны моей программы, но она-то ничего такого не выдаёт :(
Отредактировано maxim.tashkinov (Окт. 20, 2015 08:08:11)
Офлайн
maxim.tashkinov
эээ ну так у вас в коде try finally секция есть. Если внутри нее произойдет ошибка - то ничего и не будет показано. пользуйтесь try except finally конструкцией
Офлайн
Вот сегодня как раз дошёл до этого, except добавил - не попадает ничего в except!
Офлайн
что интересно, на соседнем порту работает аналогичная программа.
Она ждёт соединения, отправляет данные, получает подтверждение. Там всё хорошо.
В wireshark-e
ACK (с 2000 порта)
PSH,ACK - с 2000 порта
PSH,ACK - на 2000 порт - подтверждение
Здесь же
ACK - на 2001
RST, ACK - c 2001
PSH, ACK - на 2001
PSH, ACK - c 2001
ACK - c 2001
FIN, ACK - на 2001
хм, ясно что программки работают по-разному - не хватает пока полного понимания, что происходит с другой стороны.
Офлайн