Факт
В документации POSIX я не вижу ничего, что предотвращало бы использование опции сокета SO_REUSEADDR
с AF_UNIX
для доменных сокетов UNIX.
Тем не менее, он неизменно терпит неудачу при bind
времени, если сокет node уже существует и, кажется, игнорируется и, кажется, требуется разблокировать сокет node в файловой системе, прежде чем вызвать bind
; Короче говоря, он не повторно использует адрес. В этой сети есть много потоков, и ни один из них не имеет решения.
Вопрос
Я не буду настаивать, если он не работает, он не работает (кажется, по крайней мере, как на BSD, так и на Linux), и просто возникает вопрос: это нормальное поведение или нет? Есть ли какие-либо указатели, предлагающие его, должны поддерживаться, или наоборот, любые указатели, предлагающие это, не должны? Или это неуказано? Обратите внимание, что вопрос задается в контексте POSIX, а не в каком-либо конкретном контексте платформы.
Я приветствую любую ссылку POSIX по этому вопросу.
Дополнительно: крошечный фрагмент, чтобы не слепо unlink
who-know-what
Я видел некоторые потоки в Интернете, предлагая unlink
любое node ожидаемого имени до bind
. Я чувствую, что это небезопасно, и нужно только отменить node, который уже является сокетом node в этом случае: ex. вероятно, неправильно, чтобы отсоединить текстовый файл с именем mysocket
, чтобы воссоздать сокет node с тем же именем. В этой цели здесь крошечный фрагмент:
/* Create the socket node
* ----------------------
* Note `SO_REUSEADDR` does not work with `AF_UNIX` sockets,
* so we will have to unlink the socket node if it already exists,
* before we bind. For safety, we won't unlink an already existing node
* which is not a socket node.
*/
status = stat (path, &st);
if (status == 0) {
/* A file already exists. Check if this file is a socket node.
* * If yes: unlink it.
* * If no: treat it as an error condition.
*/
if ((st.st_mode & S_IFMT) == S_IFSOCK) {
status = unlink (path);
if (status != 0) {
perror ("Error unlinking the socket node");
exit (1);
}
}
else {
/* We won't unlink to create a socket in place of who-know-what.
* Note: don't use `perror` here, as `status == 0` (this is an
* error we've defined, not an error returned by a system-call).
*/
fprintf (stderr, "The path already exists and is not a socket node.\n");
exit (1);
}
}
else {
if (errno == ENOENT) {
/* No file of the same path: do nothing. */
}
else {
perror ("Error stating the socket node path");
exit (1);
}
}
/* … invoke `bind` here, which will create the socket node … */