>Как вы посоветовали,я попробовал создать мега-буффер в оперативной памяти.
>Сделал это с помощью маллока, который затем расширяется с реаллоком дальше по
>мере поступления новых строк. После окончания цикла, переписываю всю область в
>файл с помощью fprintf. Я правильно выделял для этого память или
>есть другие более лучшие методы? Имеет ли fprintf ограничение по обьёму
>памяти, которую с помощью него можно переписать в файл? Память лучше выделить сразу большой кусок, так как при realloc() данные могут быть перемещены в памяти, а знаит, процессор будет занят тупым копированием данных. fprintf() лучше заменить на системные вызовы open(), read(), close(), потому что мало ли какие буферы он сам выделяет и сколько на это времени тратит.
>До тех пор, пока речь шла о маленьких обьёмах в размере нескольких
>килобайт, всё было ок. Когда увеличивается количество пересылаемых сообщений(а оно должно
>быть порядко миллиона в итоге, - размер до десятков мегабайт
>(размер оперативки позволяет,- постоянно около 100 МБ свободны)),- получатель недополучает сообщения
Вот, похоже что когда делается realloc() например с 80Мб до 81Мб, то копирование данных в новый буфер может занимать достаточно времени для потери пакетов.
>и так как я ещё не встроил никакой системы выхода из
>цикла for(), программа просто ждёт поступления новых сообщений.
>Как встроить этот выход пока не решил, - может быть что-то подскажете?
Зависит от того, какое условие выхода.
>Далее наблюдаю такую картину: когда у отправителя вывожу на экран, что посылаю,
>сообщения пересылаются гораздо чётче(меньше пропавших).Как только выключаю printf, сразу куча строк
>теряется. Посредством вывода на экран может быть буффер, который я резервирую,
>освобождается- поэтому?
Посредством вывода на экран вы занимаете процессор отправителя "лишней" работой между отправкой пакетов, поэтому, возможно, количество отправленных пакетов/сек будет меньше, чем раньше, а значит меньше будет и потерянных.