Найти - Пользователи
Полная версия: Работа с socket-ом: обрыв канала связи
Начало » Network » Работа с socket-ом: обрыв канала связи
1
maxim.tashkinov
Задача следующая:
Дождаться входящего соединения на определённом порту, разобрать бинарные данные, сформировать ответ, отправить обратно.
Соединения производятся раз в пять секунд, например.

Проблема: половина (каждый второй) ответ обрывается - в 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()

Было бы понятно, если бы терялись все ответы, но тут - ровно половина.

Может быть, кто-то сталкивался с подобным?
JOHN_16
когда описывает проблему, не важно где, указывайте полный traceback ошибки
maxim.tashkinov
Нет ошибки со стороны питона, вот в чём дело. С моей стороны всё выглядит идеально.
Канал выглядит оборванным как будто бы со стороны моей программы, но она-то ничего такого не выдаёт :(
JOHN_16
maxim.tashkinov
эээ ну так у вас в коде try finally секция есть. Если внутри нее произойдет ошибка - то ничего и не будет показано. пользуйтесь try except finally конструкцией
maxim.tashkinov
Вот сегодня как раз дошёл до этого, except добавил - не попадает ничего в except!
maxim.tashkinov
что интересно, на соседнем порту работает аналогичная программа.

Она ждёт соединения, отправляет данные, получает подтверждение. Там всё хорошо.
В 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


хм, ясно что программки работают по-разному - не хватает пока полного понимания, что происходит с другой стороны.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB