Невозможно повторно использовать порт при принудительном уничтожении и повторном порождении приложения TCP Socket - PullRequest
0 голосов
/ 28 мая 2019

У меня есть приложение, которое выполняет функции сторожевого устройства для другого приложения. Обязанность сторожевого таймера состоит в том, чтобы отслеживать существование хост-приложения и повторно вызывать его всякий раз, когда оно умирает.

Ниже приведен код сокета:

sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock < 0) { 
    return (-1);
}

int optval = 1;
struct timeval tv;
tv.tv_sec = SOC_READ_TIMEOUT;
tv.tv_usec = 0;
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*) &tv, sizeof(tv));

tv.tv_sec = SOC_READ_TIMEOUT;
tv.tv_usec = 0;
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*) &tv, sizeof(tv));
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (int*) &optval,
        sizeof(int));

name.sin_family = AF_INET;
name.sin_port = htons(port);
name.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sock, (sockaddr *) &name, sizeof(name)) < 0) {
    close(sock);
    return (-1);
}

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я убиваю экземпляр приложения хоста. Новый экземпляр выдает ошибку «Невозможно назначить запрошенный адрес». Я считаю, что это происходит потому, что Raspbian OS не поддерживает SO_REUSEPORT.

Есть ли способ, я могу решить это? Любое предложение приветствуется.

1 Ответ

0 голосов
/ 30 мая 2019

Спасибо, Тони, и супер.Похоже, что у хост-приложения было несколько экземпляров, порожденных процессом сторожевого таймера, и именно поэтому возникла проблема.Разрешил.

...