Создание tcp сервера

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

yser
новенький
Сообщения: 29
Зарегистрирован: 06.02.2008 10:27:40

Сообщение yser »

Yurakl писал(а):Вот tcp сервер
....
подскажите, пожалуйста, как сервер может получить подтверждение о том,что отправленные байты дошли до получателя, т.е. связь по ethernet есть


вообщем если связь есть - то данные точно дошли т.к. протокол TCP вроде как гарантирует "TCP — это транспортный механизм, предоставляющий поток данных, с предварительной установкой соединения, за счёт этого дающий уверенность в достоверности получаемых данных, в отличие от UDP, гарантирует, что приложение получит данные точно в такой же последовательности, в какой они были отправлены, и без потерь."

Добавлено спустя 19 минут 17 секунд:
Yurakl писал(а):Кстати команда send возвращает количество переданных символов!и если клиент отрублен, то соответственно она возвратит -1.

Рекомендую когда установлено соединенение, переодически посылать мелкие пакеты чтоб соединение не падало т.к. в свое время столкнулся с такой проблемой, что при отсутствии передачи данных в течении какогото времени соединение разрывалось, а клиент и сервер этого не замечают. Как оказалось виноват был NAT-сервер который обеспечивал соединение через и-нет, он просто сбрасывал соединение при отсутствии передачи данных в течении какогото времени.
Timid
постоялец
Сообщения: 290
Зарегистрирован: 21.11.2007 20:33:15

Сообщение Timid »

Рекомендую когда установлено соединенение, переодически посылать мелкие пакеты чтоб соединение не падало

Правильный подход. Шлите от клиента пакет с временем на клиенте. Например: "ping "+IntToStr(GetTickCount), раз в 5 секунд.
Yurakl
новенький
Сообщения: 62
Зарегистрирован: 20.01.2010 07:59:53

Сообщение Yurakl »

я для проверки соединения отсылаю нулевой байт
i:=send(p,buf[0],0,MSG_NOSIGNAL);
При начальном включении, когда связи нет i=-1, при ее появлении I=0, а вот разрыве связи i также остается равным 0. Почему так?
eevee
новенький
Сообщения: 63
Зарегистрирован: 29.12.2009 16:52:44
Откуда: Саратов

Сообщение eevee »

Это зависит от ядра линукса. Там стоит время жизни соединения, и делать с ним ничего в принципе не надо.

Если Вы разрабатываете клиент/серверное приложение, то делайте прием и передачу каких нибудь служебных пакетов через определенное время. Если за определенное время пакет не поступил - рвать связь и пытаться соединяться заново. Но это хорошо работает, если клиент и сервер созданы Вами либо Вы знаете, как общаются сторонние клиент либо сервер.
Yurakl
новенький
Сообщения: 62
Зарегистрирован: 20.01.2010 07:59:53

Сообщение Yurakl »

Дело во том, что если посылать не 0, а к примеру 5 байтов,то при отсутствии соединения будет возвращаться -1, а не 0
Ответить