send () в сокете UDS возвращается без отправки всех данных. Зачем? - PullRequest
0 голосов
/ 05 марта 2019

Я работаю на встроенном устройстве под управлением Linux.В моем приложении серверный поток открывает сокет UDS и ожидает подключения.Когда клиент (другое приложение / процесс) подключается, он обрабатывает запрос и отправляет запрошенные данные.

Запрошенные данные обычно превышают 52 КБ.Однако вызов send () возвращается после отправки только 32064 байтов.Это поведение замечено периодически;часто весь процесс размером 52 КБ или более отправляется клиентскому процессу без проблем.

Может кто-нибудь подсказать, каковы возможные причины возврата send () в середине передачи?

У меня нет кода клиента, только код сервера, но мне не разрешено размещать его здесь.Из того, что у меня есть, я не вижу кода сервера, когда-либо закрывающего указанный сокет.Он закрывается только тогда, когда все приложение закрывается.

Есть ли способ, которым соединение с сокетом может закончиться без явного закрытия клиентом или сервером?Поскольку у меня нет клиента clode, я ищу возможности, что код сервера делает что-то глупое.

Цените любые входные данные по этому.

Спасибо!

1 Ответ

2 голосов
/ 05 марта 2019

При успешном выполнении send () возвращает количество отправленных байтов, это не гарантирует, что все ваши данные были записаны, вам нужно вызвать их снова с оставшимися данными, это поведение зависит от размеров внутренних буферов.То же самое относится и к функции read ().

"Единственная разница между send () и write (2) заключается в наличии флагов. При нулевом аргументе flags функция send () эквивалентнаto write (2). " Источник: man 2 send

" Количество записанных байтов может быть меньше количества, если, например, на базовом физическом носителе недостаточно места,или обнаружен предел ресурса RLIMIT_FSIZE (см. setrlimit (2)), или вызов был прерван обработчиком сигнала после записи меньше, чем число байтов. (См. также pipe (7).) " Источник: man 2 write

...