Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 19, 2015 15:58:26

maxim.tashkinov
От:
Зарегистрирован: 2008-07-07
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с socket-ом: обрыв канала связи

Задача следующая:
Дождаться входящего соединения на определённом порту, разобрать бинарные данные, сформировать ответ, отправить обратно.
Соединения производятся раз в пять секунд, например.

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

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

Может быть, кто-то сталкивался с подобным?



Офлайн

#2 Окт. 19, 2015 23:44:42

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Работа с socket-ом: обрыв канала связи

когда описывает проблему, не важно где, указывайте полный traceback ошибки



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Окт. 20, 2015 08:08:01

maxim.tashkinov
От:
Зарегистрирован: 2008-07-07
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с socket-ом: обрыв канала связи

Нет ошибки со стороны питона, вот в чём дело. С моей стороны всё выглядит идеально.
Канал выглядит оборванным как будто бы со стороны моей программы, но она-то ничего такого не выдаёт :(



Отредактировано maxim.tashkinov (Окт. 20, 2015 08:08:11)

Офлайн

#4 Окт. 20, 2015 09:58:05

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Работа с socket-ом: обрыв канала связи

maxim.tashkinov
эээ ну так у вас в коде try finally секция есть. Если внутри нее произойдет ошибка - то ничего и не будет показано. пользуйтесь try except finally конструкцией



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Окт. 20, 2015 16:00:02

maxim.tashkinov
От:
Зарегистрирован: 2008-07-07
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с socket-ом: обрыв канала связи

Вот сегодня как раз дошёл до этого, except добавил - не попадает ничего в except!



Офлайн

#6 Окт. 20, 2015 16:16:47

maxim.tashkinov
От:
Зарегистрирован: 2008-07-07
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с socket-ом: обрыв канала связи

что интересно, на соседнем порту работает аналогичная программа.

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


хм, ясно что программки работают по-разному - не хватает пока полного понимания, что происходит с другой стороны.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version