Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 13, 2014 11:41:47

randint_1_1
Зарегистрирован: 2013-11-24
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с сокетами

Приветствую всех.
Столкнулся довольно давно с такой проблемой, долго думал и пробывал разные вещи но ничего толкового не придумал изза непонимания причины проблемы.
Суть проста.Есть клиент,есть сервер.Клиент подключается к серверу и ждёт данных и на основе полученных данных вызывает определённую функцию.По началу всё работает,но если данные не будут приходить гдето минут 5 и более то соединение застывает,netstat с обеих сторон говорит что они подключены друг к другу но вот данные уже не идут клиенту.Пробовал ставить keepalive с обеих и не с обеих сторон - не помогает.Тогда пришла другая идея.Сервер в отдельном потоке раз в 2 минуты шлёт несколько байт клиенту,получился эдакий пинг.Если таким образом пинговать то всё работает без проблем.Хотел бы у вас спросить почему такое происходит и есть ли более красивое решение?
p.s. серверная часть на ubuntu,клиентская на windows

Отредактировано randint_1_1 (Июнь 13, 2014 11:43:20)

Офлайн

#2 Июнь 15, 2014 00:38:34

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

проблема с сокетами

Офлайн

#3 Июнь 15, 2014 04:41:59

randint_1_1
Зарегистрирован: 2013-11-24
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с сокетами

GreyZmeem
Вопрос на SO 1-в-1 как ваш: http://stackoverflow.com/questions/12248132/how-to-change-tcp-keepalive-timer-using-python-script
в том то и дело что пробовал ставить keepalive и на сервере и на клиенте - не помогает, помогает только ручной пинг в духе s.send('ping')

Отредактировано randint_1_1 (Июнь 15, 2014 05:13:59)

Офлайн

#4 Авг. 31, 2014 23:22:15

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

проблема с сокетами

Может хоть код представите , там уж и будем разбираться , как клиент и как сервер взаимодействуют.

Офлайн

#5 Сен. 2, 2014 22:12:34

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

проблема с сокетами

randint_1_1
в том то и дело что пробовал ставить keepalive и на сервере и на клиенте - не помогает, помогает только ручной пинг в духе s.send('ping')
Не слышал про “keepalive” для сокетов, а вот ручной пинг - это норма. По настоящему нет никакого соединения, просто периодический приходят пакеты, при этом считается соединение есть, если пакет не приходит определенное время (timeout) то “создается” разрыв.
Так же вы можете наткнуться на переразбиение пакетов (особенно при высокой нагрузке), например сервер отправил 3 пакета , а клиенту может прийти 2 пакета: , и это нужно учитывать.

Что-б не думать о таких нюансах, можно использовать zmq или т.п. там и “пинги” и пакеты и др. нюансы предусмотрены, вот неплохая вводная статья: http://nichol.as/zeromq-an-introduction

Офлайн

#6 Сен. 2, 2014 22:24:14

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

проблема с сокетами

Почитал про keepalive, штука не плохая, похоже в винде и линухе коды (и названия) разные на это дело, в винде 0x8, в линухе 0x10

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version