![]() |
|
Модераторы: feodorv |
![]()
|
|
| SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 1 Всего: 18 |
Есть соединение на основе блокирующего сокета, при плохой работе сети естественно возникает «SOCKET_ERROR» (при обмене данными) .
Плохое соединение вызвано мелкими неравномерными скачками сети (в виде кратковременного разрыва), в целом скорость передачи данных высока. Кто подскажет как можно «за грубить» сокет от скачков в сети, UDP не подойдет, так, как доставка данных строго обязательна. ========== Использую WinSock... Это сообщение отредактировал(а) SVN74 - 3.11.2008, 00:28 |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
||||
|
||||
| SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 1 Всего: 18 |
Ошибка возникает на сокете в любой ситуации при плохой работе сети в виде значения SOCKET_ERROR (-1). К примеру идет пересылка данных, в этот момент в сети происходит кратковременное падение пропускной способности, причем падение достигает такого уровня, что сокет возвращает (-1) и происходит это на столько быстро и неравномерно, что если закрыть глаза на "SOCKET_ERROR (-1)" и продолжить опять цикл чтения - сокет опять начинает получать данные. Конечно, можно было бы просто пропускать ошибку сокета, но хотелось бы просто "загрубить" сам сокет на предмет "ожидания времени отклика". |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
ошибка возвращается в значении errno (*nix) или WSAGetLastError() (win)
далее, обычно для TCP соединения любая ошибка (за исключением EWOULDBLOCK) означает разрыв соединения - тут ничего продолжать невозможно. какой у вас сокет - UDP или TCP? |
|||
|
||||
| SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 1 Всего: 18 |
Использую TCP, WSAGetLastError() -> возвращает: "Удаленный хост принудительно разорвал соединение" ================= Если бы как ни будь притормозить сокет, этой ошибки не было бы, а соединение как ни странно "иногда" можно восстановить, но не всегда, сам удивлен... Это сообщение отредактировал(а) SVN74 - 3.11.2008, 20:03 |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
вы ничего не можете с этим сделать
для TCP любая ошибка (кроме EWOULDBLOCK для неблокирующего сокета) означает разрыв соединения то, что сокет в вашем случае остается живой и вы можете его использовать несмотря на ошибку - просто частный случай конкретной реализации - вы не можете на это расчитывать даже в пределах одной ОС той-же версии - реализация библиотеки сокетов может быть различной. При получении ошибки вы должны считать соединение разорванным. Как мне видится, единственное простое решение в вашем случае - автоматически пытаться создать новое соединение и продолжить сессию - т.е. реализовать уровень сессии - при этом случайный разрыв соединения не будет разрывом сессии, т.е. снаружи будет выглядеть так, будто никакого разрыва не было. Это сообщение отредактировал(а) J0ker - 3.11.2008, 20:36 |
|||
|
||||
| SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 1 Всего: 18 |
Спасибо, я об этом тоже подумал - для передачи файлов я так и сделаю, но у меня есть данные и не только "файлы" но и звук и видео, вот как мне в этом случае быть, как я узнаю когда сеть разрывает, а когда клиент сам разрывает связь ( к примеру у клиента комп. вырубился)? В остальных случаях я к примеру могу конечно передать "код-end" .
|
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
для этого используют UDP-based протоколы, т.к. важнее своевременная доставка контента, нежели целостность. Т.е. допускаются потери пакетов, но взамен имеется непрерывность воспроизведения. |
|||
|
||||
| SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 1 Всего: 18 |
в звуке у меня применяется MP3 кодек, в нем ошибки просто недопустимы, поэтому использую TCP |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |