2015-06-13 1 views
1

Я пишу прокси-сервер TCP, используя эпоксидный эффект, созданный с помощью краевого эффекта, для мониторинга fd, сращивания для передачи данных. Вот проблема: Как узнать, что буфер приема сокетов пуст?с использованием сращивания с гнездом может вызвать голод

Например, если вы вызываете чтение (2), прося прочитать определенный объем данных, а чтение (2) возвращает меньшее количество байтов, вы можете быть уверены в том, что исчерпали пространство чтения ввода-вывода для дескриптора файла.

Но я обнаружил, что даже сращивания (носок, 0, п.п.м. [1], 0, 65536, SPLICE_F_NONBLOCK) < 65536 может иногда приводить к голоданию.

O_NONBLOCK включен, п> PIPE_BUF Если труба заполнена, то запись (2) выходит из строя, с егто установлен в EAGAIN. В противном случае может быть записано от 1 до n байтов (т. Е. Может произойти «частичная запись», вызывающий должен проверить возвращаемое значение из записи (2), чтобы увидеть, сколько байтов было фактически записано), и эти байты могут чередоваться с пишет другими процессами.

Так что я должен повторить вызов сплайсинга до EAGAIN? Но как я могу узнать, пустой буфер приема сокета или заполнен буфер буфера?

ответ

0

Может быть, вы можете использовать getsockopt с SO_ERROR системный вызов, и тогда вы будете известно, какой сокет действительно EAGAIN, а затем использовать epoll, чтобы посмотреть события на чтение/запись этого сокета.

У меня также есть эта проблема при добавлении обратного HTTP-прокси на мой веб-сервер, я считаю, что он должен работать, хотя я не уверен, что это лучшее решение.

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