Проблема с блокировкой доменных сокетов unix

Я пишу приложение, которое разделено на две части для Mac OS X - демон и агент. Я использую стандартный сокет Unix для связи между демоном и агентами. То есть сокет создан с PF_UNIX а также SOCK_STREAM,

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

я использую select() проверить данные, которые можно прочитать. select() вызов успешен и указывает, что есть данные для чтения. Тем не менее, когда я звоню recv() он возвращается с -1, а также errno установлен в 35, или же "Resource temporarily unavailable".

Теперь, я ожидал бы это для неблокирующего сокета, но я проверил трижды - я никогда не устанавливал сокет как неблокирующий.

Насколько я могу судить, это происходит только тогда, когда второй агент подключается к тому же сокету Unix. Если я ограничу себя одним демоном и одним агентом, то все, кажется, будет работать идеально. Что может быть причиной этого странного поведения?

1 ответ

Это звучит так, будто вы пытаетесь прочитать не с того клиента, fd. Трудно сказать, не видя ваш код, но это также звучит немного иначе из вашего описания.

Так что на всякий случай вот как это работает. Ваш сервер заканчивается тремя файловыми дескрипторами, сокетом, который он сначала прослушивает, а затем одним файловым дескриптором для каждого подключенного клиента. Когда есть что прочитать на оригинальном сокете, это означает, что есть новый клиент; Похоже, у вас есть эта часть права. Каждый подключенный клиент затем дает вам свой собственный независимый fd для чтения / записи. Вызов select() вернется, если любой из них готов к чтению; Затем вы должны проверить каждый fd в переменной readfds из select с помощью FD_ISSET(), чтобы увидеть, есть ли на самом деле данные для чтения.

Вы можете увидеть базовый пример этого типа кода здесь.

Другие вопросы по тегам