Сообщения не доходят
От: Agile Россия  
Дата: 13.03.05 10:43
Оценка:
UDP
Есть программа — сервер, которая слушает порт.
Есть клиент, который кидает пакеты на тот порт, и получает с того порта.
В клиенте 2 нити:
одна слушает свой порт(исп. select)
одна рабочая
Я через рабочую нить откидываю 3 сообщения на сервер.(сокеты созданы по-умолчанию — в блокированном режиме), но на сервер почему-то доходят иногда все, иногда 2-е, иногда 3-е сообщение. Что это может быть?

з.ы. если же я поставлю Sleep(100) в рабочей нити после каждого send'a, то все доходит.
з.ы. Windows XP sp2, VS7.1, LAN
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re: Сообщения не доходят
От: Michael Chelnokov Украина  
Дата: 13.03.05 11:07
Оценка:
Здравствуйте, Agile, Вы писали:

A>UDP

A>...Что это может быть?

UDP и есть.
Re: Сообщения не доходят
От: Аноним  
Дата: 13.03.05 11:16
Оценка:
Здравствуйте, Agile, Вы писали:

A>Я через рабочую нить откидываю 3 сообщения на сервер.(сокеты созданы по-умолчанию — в блокированном режиме), но на сервер почему-то доходят иногда все, иногда 2-е, иногда 3-е сообщение. Что это может быть?


A>з.ы. если же я поставлю Sleep(100) в рабочей нити после каждого send'a, то все доходит.

A>з.ы. Windows XP sp2, VS7.1, LAN

Вероятно, вы считаете(нумеруете) сообщения таким образом, что каждый вызов функции send(...) для клиента соответствует одному исполнению функции recv(...) для сервера, т.е. когда из вашей основной нити программы идет отправка сообщений подряд... На сервер они приходят в один буфер, и читаются из него поточно(независемо от количества send-ов), т.е. образом, вы отсылаете не "сообщения", а части(пакеты) одного непрерывного потока. Для испраления такого рода ошибки обычно используют 3 подхода:
1. сообщения имеют строго определнный размер, а recv(...), соответсвенно, принимает указанное количество байт(записей);
2. вводится спциальный символ-разделитель, при чтении которого из буфера, происходит разделение на сообщения;
3. при отправке/приеме в/из буфер/а сперва пишется/читается количество байт(записей) необходимое для одного сообщения.
Re[2]: Сообщения не доходят
От: MaximE Великобритания  
Дата: 13.03.05 17:45
Оценка:
wrote:

> Вероятно, вы считаете(нумеруете) сообщения таким образом, что каждый вызов функции send(...) для клиента соответствует одному исполнению функции recv(...) для сервера, т.е. когда из вашей основной нити программы идет отправка сообщений подряд... На сервер они приходят в один буфер, и читаются из него поточно(независемо от количества send-ов), т.е. образом, вы отсылаете не "сообщения", а части(пакеты) одного непрерывного потока.


Это для TCP. Автор треда спрашивал про UDP.

--
Maxim Yegorushkin

Those who do not understand Unix are condemned to reinvent it, poorly. © Henry Spencer
Posted via RSDN NNTP Server 1.9
Re[2]: Сообщения не доходят
От: Agile Россия  
Дата: 13.03.05 19:40
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Здравствуйте, Agile, Вы писали:


A>>UDP

A>>...Что это может быть?

MC>UDP и есть.


да но клиент и сервер запускаются на одной машине. Т.е. происходит loopback при отправке и при этом такие потери ?
Re[3]: Сообщения не доходят
От: MaximE Великобритания  
Дата: 13.03.05 19:50
Оценка:
Agile wrote:

> Здравствуйте, Michael Chelnokov, Вы писали:

>
> MC>Здравствуйте, Agile, Вы писали:
>
> A>>UDP
> A>>...Что это может быть?
>
> MC>UDP и есть.
>
> да но клиент и сервер запускаются на одной машине. Т.е. происходит loopback при отправке и при этом такие потери ?

Если клиент занят только посылкой максимального количества дейтаграмм, то возможно, что буфер сервера переполняется и дейтаграммы отбрасываются.

Еще возможно, что твой клиент стартует раньше сервера и посылает дейтаграммы на еще не прослушиваемый порт.

--
Maxim Yegorushkin

Those who do not understand Unix are condemned to reinvent it, poorly. © Henry Spencer
Posted via RSDN NNTP Server 1.9
Re[3]: Сообщения не доходят
От: unforgiven_hero Ниоткуда www.lleo.aha.ru/na
Дата: 13.03.05 19:52
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Это для TCP. Автор треда спрашивал про UDP.


Хорошо, что поправили, но я же сказал вероятно... И вообще, как сказал сам автор во 2-ом посте, он запускает приложения на одной машине, так что проблем с передачей самих данных быть не должно, а, соответсвенно, и ошибок в этой самой передаче. А в вашем посте, я, извините, не увидел совета
Monakhov
Re[3]: Сообщения не доходят
От: Аноним  
Дата: 13.03.05 20:36
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>wrote:


ME>Это для TCP. Автор треда спрашивал про UDP.


ME>Those who do not understand Unix are condemned to reinvent it, poorly. © Henry Spencer[/i]


А почему вы думаете что это не для TCP? Вы еще скажите, что функция connect() для UDP не работает.
Re[4]: Сообщения не доходят
От: MaximE Великобритания  
Дата: 13.03.05 20:45
Оценка:
wrote:

> ME>Это для TCP. Автор треда спрашивал про UDP.

>
> А почему вы думаете что это не для TCP?

Что "это"? И причем здесь "не"?

> Вы еще скажите, что функция connect() для UDP не работает.


Зачем я буду это говорить?

--
Maxim Yegorushkin

Those who do not understand Unix are condemned to reinvent it, poorly. © Henry Spencer
Posted via RSDN NNTP Server 1.9
Re[3]: Сообщения не доходят
От: осьмилис Россия  
Дата: 13.03.05 21:28
Оценка: :))
Здравствуйте, Agile, Вы писали:

A>>>...Что это может быть?


MC>>UDP и есть.


A>да но клиент и сервер запускаются на одной машине. Т.е. происходит loopback при отправке и при этом такие потери ?


UDP == Unreliable Datagram Protocol. т.е. по своему определению он ничего не гарантирует. ни доставки, ни порядка прибытия датаграмм, ни по сети, ни в пределах одной машины... в таких случаях говорят "контроль целостности/итп должен быть возложен на протокол более высокого уровня". Sleep в данном случае играет роль бубна
Re[5]: Сообщения не доходят
От: Аноним  
Дата: 13.03.05 22:10
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>wrote:


>> ME>Это для TCP. Автор треда спрашивал про UDP.

>>
>> А почему вы думаете что это не для TCP?

ME>Что "это"? И причем здесь "не"?


Да, я как-то не правильно сказал.

Я имею в виду, что если отправка/получение реализованно с помощью функций recv/send, то пакты дейисвительно могли смешаться.
Re[6]: Сообщения не доходят
От: MaximE Великобритания  
Дата: 14.03.05 06:34
Оценка:
wrote:

> Я имею в виду, что если отправка/получение реализованно с помощью функций recv/send, то пакты дейисвительно могли смешаться.


Что значит "смешаться"?

UDP дейтаграммы могут прийти не в том порядке, котором были отправлены, но со стороны вызова recv/recv_from они всегда приходят целиком.

--
Maxim Yegorushkin

Those who do not understand Unix are condemned to reinvent it, poorly. © Henry Spencer
Posted via RSDN NNTP Server 1.9
Re[3]: Сообщения не доходят
От: Michael Chelnokov Украина  
Дата: 15.03.05 10:39
Оценка: 3 (1)
Здравствуйте, Agile, Вы писали:

A>>>UDP

A>да но клиент и сервер запускаются на одной машине. Т.е. происходит loopback при отправке и при этом такие потери ?

Это не потери. Скорее всего, как тут уже было отмечено, происходит переполнение буфера на принимающей стороне (новые сообщения затирают старые). Тем более это возможно на одной машине, т.к. пока процессор занят отправляющим потоком, принимать просто некому — буфер успевает переполнится быстрее чем осуществляется переключение процессора на принимающий поток.
Эволюционное решение — увеличить размер буфера.
Революционное — пересмотреть согласование работы клиента и сервера. В особенности обратить внимание на сервер, чтобы он в любом случае успевал выгребать сообщения из буфера быстрее чем они туда могут поступать. Ну а в случае когда и клиент и сервер находятся на одной машине, учитывать тот факт что они работают последовательно (я так понимаю, машина не двухпроцессорная) и исходя из этого анализировать ситуацию.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.