В моем тестировании я обнаружил, что когда я отправляю пакеты с байтами 1000-5000 байт от моего отправителя, они собираются/объединяются в приемник размером 8000-14000 байт. Я проверил захват проводов, чтобы подтвердить это.TCP-разъем непрерывно возвращает EAGAIN
У меня есть 2 вопроса: 1) Кто связывает эти пакеты между ними, приемник получает их, и я использую select() для обнаружения данных и вызова recvmsg api?.
2) Когда в приемнике увеличиваются пакеты длин, я осуществил частичный прием, так что «recvmsg» также возвращает частичные данные. В этом случае через некоторое время вызов recvmsg возвращает EAGAIN с 0 байтами. Соединение с одноранговым узлом все еще работает, потому что peer по-прежнему отправляет пакеты, почему ошибка recvmsg callureuring с EAGAIN?.
Пожалуйста, помогите!
Вы должны быть в неблокирующем режиме. Решение: d не будет, или используйте select(). – EJP
Я уже использую select() для получения уведомлений для данных. Мой ресивер может получать данные в течение некоторого времени, но по мере поступления больших байтов вызовы recvmsg возвращают o байтов. – Manish
Этого никогда не следует делать, если select() указал, что канал доступен для чтения. Ваше описание не имеет смысла. Если recv() возвращает -1 с errno, установленным в EAGAIN, он также не дает вам нулевые байты одновременно. Он не может возвращать ноль * и * -1. Если вы получите EAGAIN, это означает, что читать нечего и вам нужно повторно выбрать. – EJP