Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Romeo13
6 / 6 / 0
Регистрация: 01.08.2011
Сообщений: 133
1

Socket: потеря пакетов

04.11.2012, 09:23. Просмотров 2448. Ответов 12
Метки нет (Все метки)

Всем доброго дня. Следующая ситуация:
Я работаю с сокетом асинхронными операциями и пакеты время от времени (не систематически) теряются. Если я тестирую приложение на своем же компьютере, все работает идеально. Начинаю тестировать в локальной сети, сообщения теряются.
Разве TCP не наточен на 100% доставку пакетов? Нужно писать код на проверку доставки сообщений или все таки где то у себя ошибся?

Программный код не прилагаю из-за его огромности=)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2012, 09:23
Ответы с готовыми решениями:

COM потеря контекста. rpc_e_disconnected
Текст ошибки стандартный Если кто работает с такой штукой, подскажите как...

Потеря dataset при копировании
Добрый день! Видимо совсем идиотический вопрос, но: есть следующий код...

TCP (Клиент-сервер) - потеря данных
Добрый день, меня интересует такой вопрос, я имею два приложения клиент-сервер...

Потеря данных при передаче по TCP
Система сложная, отслеживает и записывает все происходящее. В итоге получается...

Потеря данных при xml десериализации
Всем привет! Столкнулся с проблемой потери данных при xml десериализации...

12
kolorotur
Эксперт .NET
10499 / 8685 / 2161
Регистрация: 17.09.2011
Сообщений: 14,905
Завершенные тесты: 1
04.11.2012, 10:40 2
Цитата Сообщение от Romeo13 Посмотреть сообщение
все таки где то у себя ошибся
Вот это.

Могу посоветовать "урезать" код до минимально необходимого для принятия/отправки сообщений и выложить сюда.
Предварительно, конечно, проверив - имеется ли потеря пакетов после урезания.
0
Romeo13
6 / 6 / 0
Регистрация: 01.08.2011
Сообщений: 133
04.11.2012, 10:42  [ТС] 3
Я попробую. Просто до этого я проверяю на локальном компьютере, все ок.
0
Башир
207 / 207 / 20
Регистрация: 18.05.2010
Сообщений: 846
05.11.2012, 14:27 4
Цитата Сообщение от Romeo13 Посмотреть сообщение
Разве TCP не наточен на 100% доставку пакетов
верно, 100% доставка гарантирована !!! я работаю с сокетами и никогда пакеты не терялись
0
Romeo13
6 / 6 / 0
Регистрация: 01.08.2011
Сообщений: 133
05.11.2012, 19:02  [ТС] 5
Цитата Сообщение от Башир Посмотреть сообщение
верно, 100% доставка гарантирована !!! я работаю с сокетами и никогда пакеты не терялись
Спасибо, это облегчает мою учесть.

Добавлено через 4 часа 24 минуты
Я использую примерно такую схему:
C#
1
2
3
4
5
6
7
8
9
10
11
void Receiver()
{
      Socket.BeginReceive( ..., Receive );
}
 
void Receive(IAsyncResult Result)
{
       Socket.EndRecieve( Result );
       ........
       Reciever();
}
Это нормальный подход? Тут я все утрировано написал, все ошибки я отлавливаю и т.д. так что гарантированно если Recieve выполняется то и Reciever выполнится.
0
Vaso
7 / 7 / 0
Регистрация: 14.09.2010
Сообщений: 33
07.11.2012, 16:12 6
Пакеты можно легко просохатить, если неграмотно использовать конструкцию try {} catch {}, либо при обрыве-восстановлении соединения (почему бы в локальной сети не наблюдать изредка такую ситуацию?)

Попробуйте поиграться с выдергиванием кабеля в ЛВС, есть потери?

По-хорошему, ваша программа должна нормально обрабатывать обрыв соединения, т.к. на практике кратковременные обрывы связи все же бывают.
0
Romeo13
6 / 6 / 0
Регистрация: 01.08.2011
Сообщений: 133
07.11.2012, 16:17  [ТС] 7
Все таки имеет смысл писать код, где проверка на достоверную доставку проводится? И по подробнее про "если неграмотно использовать конструкцию try {} catch {}," если не сложно
0
Vaso
7 / 7 / 0
Регистрация: 14.09.2010
Сообщений: 33
07.11.2012, 16:31 8
Ну, во-первых, TCP - это поток, а не обмен "пакетами"

Может получиться так, что вы шлете команды в поток

"сделай_что_то;"
"сделай_еще_что_то;"
"и_еще;"

а асинхронно придет так
первый кусок

"сделай_что_то;сделай_е"

второй кусок
"ще_что_то;и_еще;"

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


Во-вторых, надо смотреть, какие исключения возникают при работе программы (если вообще возникают)

То есть делать так не надо

C#
1
2
3
4
5
try
{
// код
}
catch (Exception e) {}
Добавлено через 2 минуты
Цитата Сообщение от Romeo13 Посмотреть сообщение
Все таки имеет смысл писать код, где проверка на достоверную доставку проводится?
протокол TCP либо выполнит доставку, либо выдаст ошибку. Это и есть проверка.

Мне кажется, в вашем случае проблемно слово "пакет", т.е. вы сами ввели это понятие в протокол TCP, и сами должны обрабатывать эти самые "пакеты". А пакеты находятся на уровне IP, и на уровне TCP управление пакетами недоступно разработчику.
0
kolorotur
Эксперт .NET
10499 / 8685 / 2161
Регистрация: 17.09.2011
Сообщений: 14,905
Завершенные тесты: 1
07.11.2012, 16:32 9
Romeo13, выложите полный код этих методов.
Чтобы не гадать.
0
Romeo13
6 / 6 / 0
Регистрация: 01.08.2011
Сообщений: 133
07.11.2012, 16:36  [ТС] 10
TCP, если пакеты не были приняты или приняты с ошибками, делает запрос на повторную передачу, в итоге, если собеседник просто отключен, выдает исключение, потому что связь прервана (таймаут вышел) или я не прав?

А про то, что

Цитата Сообщение от Vaso Посмотреть сообщение
То есть делать так не надо
И коню понятно=) я ошибки по-другому отлавливаю

Добавлено через 1 минуту
Цитата Сообщение от Vaso Посмотреть сообщение
Мне кажется, в вашем случае проблемно слово "пакет", т.е. вы сами ввели это понятие в протокол TCP, и сами должны обрабатывать эти самые "пакеты". А пакеты находятся на уровне IP, и на уровне TCP управление пакетами недоступно разработчику.
Насколько я знаю, TCP разбивает сообщение на пакеты и передает их, где в конечной точке они собираются, недостающие запрашиваются.

Добавлено через 1 минуту
Цитата Сообщение от kolorotur Посмотреть сообщение
Romeo13, выложите полный код этих методов.
Чтобы не гадать.
Это готовая программа, долго трудно и нудно будет сокращать) я решил на скорую руку без отдельного написания библиотек сделать.
0
Vaso
7 / 7 / 0
Регистрация: 14.09.2010
Сообщений: 33
07.11.2012, 16:38 11
TCP пакеты есть только у системного администратора на файрволе (где он их различает по флагам syn, fin, и прочей ерунде)

У программиста есть TCP Stream, который гарантирует, что выдаст все данные, которые запихали с другого конца, причем вернет их в той же последовательности, либо вернет ошибку.
На другом конце, соответственно, гарантирует, все данные, которые отправили в поток, доставлены, либо опять же ошибка.

Действительно, выложите код, так сложно судить
0
Башир
207 / 207 / 20
Регистрация: 18.05.2010
Сообщений: 846
12.11.2012, 10:29 12
Если на одном конце поток отправился то значит на другом конце он уже получил !!! ТСР это 100% доставка пакетов !!! Никаких состояний обрывов сети обрабатывать не надо, еще раз повторю что если на одном конце он передался то значит на другом конце он уже получил.
0
Romeo13
6 / 6 / 0
Регистрация: 01.08.2011
Сообщений: 133
12.11.2012, 16:18  [ТС] 13
Цитата Сообщение от Башир Посмотреть сообщение
Если на одном конце поток отправился то значит на другом конце он уже получил !!!
Отправка производится синхронно, т.е. Socket.Send(), и я более чем уверен что она точно производится, просто там немного блоков кода отправки. Да и если бы синхронная операция встала я бы об этом узнал.
0
12.11.2012, 16:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2012, 16:18

Потеря символов пробела TextBox.Text
Привет всем! Вот подскажите в C# у меня есть TextBox в котором я ввожу строку...

Потеря прозрачности при сохранении PNG из DOC
столкнулась с такой же проблемой, только у меня при считывании с doc в png.При...

внедрение пакетов
Здравствуйте, уважаемые знатоки,кто то сталкивался с внедрением самописных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru