>Насчёт ошибки в коде, - вполне возможно, опыта у меня толком в
>программировании практически нету.
>Что касается UDP,- попробовал сегодня, однако теряются некоторые сообщения, как и положено,
>насколько я понимаю в udp. Но зато скорость на много порядков
>выше и никаких проблем с пересылкой нескольких пакетов за один раз... Все верно, пакеты могут теряться, скорость выше (отсутствие ожидания подтверждения).
Обработка потери пакетов в этом случае на стороне приложения.
Как я понял передача идет на максимуме возможностей?
>
>Что меня удивляет с udp,- когда контролирую пересылку с помощью Wireshark, вижу,
>что все пакеты были отосланы и находились в проводе. Но в
>сохранённом файле некоторых сообщений не хватает. В конце персылки совсем выпадают
>последние 20-30 сообщений. Если я правильно понимаю,- это означает, что проблемы
>возникают н апринимаюъей стороне. Маленкий буфер? Или что могло бы это
>быть ещё.
>Для информации,- связь происходит в маленькой сетке с одним хабом, двумя машинами(с
>embedded Linux,PowerPC) и контролирующим работу Ноутбуком, где и работатет Wireshark.
Хаб штука железная однако одно дело ваш ноут который тупо только слушает что в проводах, другое дело приемная сторона которая может и посылать пакеты в тоже время, т.е. если не фул-дуплекс (да и с ним может), то хаб в ноут может отдавать весь поток, а в приемную сторону не весь (т.к. коллизии мешают). Дальше, сетевая карта может работать на приемной стороне чуть медленнее чем положено, например что-то фигово с сопряжением с системной платой (наука о контактах) как результат потери на приемной стороне. Дальше пошли по стеку вверх, на каждом уровне могут какие-то свои проблемы (режим promiscous может например снижать скорость приема), доходим до записи в файл:
выш вы приводили кусок кода сервера где:
if (length != 0)
{
printf("%s.%ld\t\t%s",puffer_our_time,tv.tv_usec,puffer_find_number_time);
}
Это в файл перенаправлено или на консоль? (консоль имеет свои задержки).
stdout - строчная буфферизация. может быть причиной.
Как выше писал может причина с fsync. Можно попробовать проверить так - создать мега-буфер (так чтобы туда минут 5 лога поместилось) в памяти и писать не в файл (fprintf), а в этот буфер (sprintf), когда буфер забьется сбросить его в файл и потом проанализировать, а были ли задержки в таком случае.
По поводу PUSH - есть опция включающая этот режим (setsockopt(TCP_NODELAY) - отключить алгоритм Нэгла), без нее флаг не ставиться если не системная настройка (может быть какой-то тюнинг сделан в той же embedded linux?).
пользователь обычный или рут? это к вопросу приоритета, а мало ли... :) это я уже фантазирую.