У меня в настоящее время есть выбор () оператор, настроенный для отслеживания два футбола UDP. Я отправляю, возможно, 10 - 20 сообщений в секунду в одном общем сокете данных, который является интерпретируемым, как я ожидал.
Однако, после того как я поразил приблизительно 1 024 сообщения, я получаю уведомление:
говорящий: сокет: Слишком много открытых говорящих файлов: не удалось связать сокет
Это логично мне, так как ulimit-n показывает макс. из 1 024 открытых файлов для этого пользователя. Однако, почему там все эти открытые файлы? С UDP нет никакой установленной связи, таким образом, я не полагаю, что должен закрывать сокет каждый раз (хотя, возможно, я неправ).
Какие-либо идеи?Заранее спасибо.
Я думаю, что в этом случае «Слишком много открытых файлов» на самом деле означает, что вы достигли предела дескриптора файла; сетевые сокеты учитываются в этом пределе. Вы уверены, что нет ничего, скажем, в routehelper
, что создает дополнительные сокеты?
На какой платформе вы работаете? Если Linux, lsof
или копошение в / proc /
- пока он запущен, до того, как он достигнет предела - может проиллюстрировать, куда идут все fd.
Совет: не полагайтесь на то, что socket_udp_inboundALL
численно больше, чем socket_udp_inboundRC
- лучше явно сравнить их значения хотя бы один раз.
Если вы работаете в Linux, выполните strace(1)
на клиенте, чтобы проверить наличие socket(2)
и open(2)
vs close(2)
системных вызовов (попробуйте -e trace=socket,open,close
). Это самый простой способ сбалансировать количество файловых дескрипторов на данный момент.