Ошибка отправки C ++ // POSIX.4 - PullRequest
1 голос
/ 29 июля 2011

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

sendto failed: Message too long (POSIX.f)

Я понимаю, что он говорит мне.Я не могу изменить длину сообщений и не хочу тратить время на фрагментацию сообщений - и все это на одном компьютере, поэтому мне не нужно ограничивать длину сообщений для этого сокета домена.

есть ли способ увеличить объем памяти, доступной для записи в сокет домена, или я что-то не так сделал в вызовах инициализации сокета / sendto / recvfrom, которые наложили бы ограничение?Буферы send / recv, которые я использовал, были довольно большими (значительно больше, чем сообщения, вызывающие ошибки).

1 Ответ

3 голосов
/ 29 июля 2011

Используете ли вы потоковые или датаграммы сокеты?Если это потоковые сокеты, вы можете просто выполнить вторую или третью запись, чтобы отправить остальные данные.Если это сокеты датаграмм, вы, вероятно, застряли (может быть, вы можете переключиться на потоковые сокеты?), Но может быть опция setsockopt, которая увеличит лимит.Тем не менее, возможно, вам нужно быть готовым к случаю, когда вы не можете увеличить лимит.По сути, ваша проблема заключается в том, что ядро ​​должно нести ответственность за хранение потенциально большого блока данных в течение неопределенного периода времени, что может легко привести к истощению ресурсов и DoS, поэтому ядро ​​(по очень веской причине) накладывает ограничения наобъем данных, которые он будет хранить для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...