2014-06-02 2 views
0

В моем тестировании я обнаружил, что когда я отправляю пакеты с байтами 1000-5000 байт от моего отправителя, они собираются/объединяются в приемник размером 8000-14000 байт. Я проверил захват проводов, чтобы подтвердить это.TCP-разъем непрерывно возвращает EAGAIN

У меня есть 2 вопроса: 1) Кто связывает эти пакеты между ними, приемник получает их, и я использую select() для обнаружения данных и вызова recvmsg api?.

2) Когда в приемнике увеличиваются пакеты длин, я осуществил частичный прием, так что «recvmsg» также возвращает частичные данные. В этом случае через некоторое время вызов recvmsg возвращает EAGAIN с 0 байтами. Соединение с одноранговым узлом все еще работает, потому что peer по-прежнему отправляет пакеты, почему ошибка recvmsg callureuring с EAGAIN?.

Пожалуйста, помогите!

+0

Вы должны быть в неблокирующем режиме. Решение: d не будет, или используйте select(). – EJP

+0

Я уже использую select() для получения уведомлений для данных. Мой ресивер может получать данные в течение некоторого времени, но по мере поступления больших байтов вызовы recvmsg возвращают o байтов. – Manish

+0

Этого никогда не следует делать, если select() указал, что канал доступен для чтения. Ваше описание не имеет смысла. Если recv() возвращает -1 с errno, установленным в EAGAIN, он также не дает вам нулевые байты одновременно. Он не может возвращать ноль * и * -1. Если вы получите EAGAIN, это означает, что читать нечего и вам нужно повторно выбрать. – EJP

ответ

0

Я обнаружил, что, когда я посылать пакеты байт 1000-5000 байт от моего отправителя, они получают собран/в комплекте на приемнике с размерами 8000-14000 байтами

1) Кто Связки этих пакетов между приемником, получает их, и я использую select() для обнаружения данных и вызова recvmsg api ?.

Если это Ethernet-пакеты размером 9000 байт, вы должны использовать jumbo frames.

TCP - это поток, нет понятия сообщения. Данные, отправленные в несколько звонков send(), могут быть получены в одном вызове recv() и наоборот.

2) Когда в приемнике увеличиваются пакеты длин, я реализовал частичный прием, так что «recvmsg» также возвращает частичные данные. В этом случае через некоторое время вызов recvmsg возвращает EAGAIN с 0 байтами. Соединение с одноранговым узлом все еще работает, потому что peer все еще отправляет пакеты, почему ошибка recvmsg call returing с EAGAIN?.

Это означает, что вы используете неблокирующие сокеты, и больше нет данных в буфере приема сокета. В этом случае вы должны использовать select/poll/epoll для ожидания в одном или нескольких сокетах, пока не будет доступно больше данных для чтения.

+0

У меня есть данные на сокете приемника, так как я использую вызов ioctl для проверки длины данных в буфере recv-сокета. Выберите return, попросив меня прочитать из этого сокета, а затем, когда я прочитаю его, recvmsg вернется EAGAIN. Это работает для небольших пакетов данных, но когда длина в буфере recv увеличивает некоторый предел, я сталкиваюсь с этой проблемой. – Manish

Смежные вопросы