что произойдет, если приемник не сможет справиться со скоростью передачи данных через сокет?

что произойдет, если приемник не сможет справиться со скоростью передачи данных через сокет?

У меня есть два процесса P1 (отправитель) и P2 (получатель). P1 использует unix-domain-socket (UDS)для отправки данных в P2. Что произойдет, если P1 будет отправлять данные со скоростью 100 сообщений в секунду, а P2 сможет получать 50 сообщений в секунду. Оба являются неблокируемыми сокетами.

Что происходит в приведенном выше сценарии? Исчерпается ли память лица p1 или p2 через некоторое время?

команда, пожалуйста, объясните, что будет происходить под капотом в приведенном выше сценарии.

Спасибо.

решение1

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

При предположении типа сокета датаграммы блокирующий сокет будет блокироваться, если буферы заполнены, и таким образом неявно замедлит отправителя. С неблокирующим сокетом отправка сообщения просто не удастся и EAGAINбудет возвращена как ошибка send. Обратите внимание, что это справедливо только для доменных сокетов unix типа датаграммы. С сокетами UDP отправка будет успешной, а сообщения просто будут потеряны.

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

Связанный контент