![]() |
|
Модераторы: feodorv |
![]()
|
|
| Alexander06 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Здравствуйте. Пишем ПО для системы сбора данных, состоящей из 2-х машин. Первая - сервер. Ожидает подключения клиентов, содержит у себя необходимые клиенту настройки. Клиент после запуска подключается к серверу, получает от него настройки и после инициализации шлет серверу данные, пока не получит какую-либо управляющую команду. Прием данных на клиенте и сервере организованы одинаково - с помощью функции recv. В пакетах первые 4 байт занимает размер пакета. Соответственно, при приеме читающий смотрит размер пакета, а потом дочитывает остальное. Все это в отдельном потоке. В другом потоке крутится функция отправки с помощью send. В случае какой-либо ошибки, и клиент и сервер разрывают соединение. В случае разорванного соединения клиент пытается подключиться снова. Вопрос...TCP гарантирует доставку пакетов. Может ли такое случиться, что в случае ошибки соединения (например, вынут кабель) часть пакета потеряется и при повторном подключении вместо того, чтобы читать заголовок с размером пакета, сервер будет читат середину прошлого пакета? Есть ли какие-то принципы организации подобных, устойчивых соединений? Спасибо. |
|||
|
||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
Дам совет: сервер не должен никогда расчитывать на правильные данные. Прислать могут что угодно , почти все должно проходить проверку! -------------------- ![]() |
|||
|
||||
| sdukshis |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 23.3.2009 Репутация: нет Всего: 1 |
Если Вы используете TCP, то такой ситуации практически быть не может, так как при разрыве связи сокет на стороне сервера уходит в состояние TAIM_WAIT для отлавливания оставшихся пакетов. Время его пребывания в режиме TIME_WAIT определяется с помощью эмпирического правила на основе предполагаемого максимального времени жизни пакета в сети обычно от 30 секунд до 2 минут. Это сообщение отредактировал(а) sdukshis - 22.5.2009, 20:34 |
|||
|
||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
TIME_WAIT -------------------- ![]() |
|||
|
||||
| Alexander06 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
TIME_WAIT...а если потеря соединения скажем на пару секунд?
У нас как раз длительного отключения не происходит. Мы контролируем содержимое пакета и в случае ошибки рвем соединение. Мой вопрос касается именно того, что будет после восстановления соединения. Наверное надо вводить в пакеты какие-то последовательности бит, чтобы в случае ошибки нащупать начало следующего пакета? |
|||
|
||||
| fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
Для контроля корректности принимаемых данных TCP использует контрольную сумму, проверив которую принимающая сторона передает подтверждение приема данных. Это означает, что если данные пришли (данные возвращены функцией ВВ) значит они корректны. TIME_WAIT необходимо, чтобы после разрыва связи другое соединение с темже IP и портом не получило пакетов, оставшихся от предыдущего соединения. При возникногвении ошибок соединения функции ВВ вернут код ошибки.
Если кода ошибки нет - данные корректны. Думаю кратковременные разрывы могут и не повлиять на работу приложения вообще. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
а если и повлияют, то есть keepalive probes на сколько я знаю, по-умолчанию длительность иинервалов между попытками "пинга" растет экспонненциально где-то до 2-х часов Добавлено через 1 минуту и 31 секунду Alexander06, TCP гарантирует как целостность данных, так и очередность никакой потери быть не может на сокет попадют только полностью полученные и проверенные части потока -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: нет Всего: 33 |
Если ответ получен, отметьте тему закрытой.
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |