Как исправить 'Адрес уже используется', возвращенный функцией bind () в AF_UNIX - PullRequest
0 голосов
/ 28 октября 2019

Я знакомлюсь с Unix-сокетами для межпроцессного взаимодействия и следую инструкции здесь . Каждый раз, когда я запускаю программу, выполняющую роль сервера (в руководстве называемую echos.c), я получаю сообщение об ошибке bind: Address already in use, за исключением первого запуска после удаления всех файлов сборки.

Ошибка приходит из этого раздела кода:

#define SOCK_PATH "echo_socket"

int main(void)
{
    int s, s2, len;
    socklen_t t;
    struct sockaddr_un local, remote;
    char str[100];

    if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }

    local.sun_family = AF_UNIX;
    strcpy(local.sun_path, SOCK_PATH);
    unlink(local.sun_path);
    len = strlen(local.sun_path) + sizeof(local.sun_family);
    if (bind(s, (struct sockaddr *)&local, len) == -1) {
        perror("bind");
        exit(1);
    }

    // ...

При первоначальном запуске программа создает файл сокета с именем echo_socke (я проверил это с помощью ls -l, и этоСтранно, что в имени отсутствует буква 't', чтобы сделать его echo_socket), и затем он успешно переходит к bind и listen для клиентского процесса.

Однако при последующих запусках, где яне удаляйте файлы сборки, я получаю сообщение об ошибке bind: Address already in use из строк

if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
     perror("socket");
     exit(1);
}

При дополнительном тестировании я обнаружил, что unlink(local.sun_path) возвращает ошибку No such file or directory, поэтому я вычисляю сокетфайл, к которому bind пытается получить доступ, не найден. Может ли это быть из-за того, что в имени файла отсутствует символ, как упоминалось ранее? (Но это работает в первый раз, так что не может быть?). Буду очень признателен за любую помощь в выяснении того, что происходит.

...