强制终止并重新生成TCP套接字应用程序时无法重用端口

时间:2019-05-28 14:01:03

标签: c++ raspberry-pi3 raspbian

我有一个应用程序充当另一个应用程序的监视程序。看门狗的职责是监视主机应用程序的存在,并在其死时重新生成它。

下面是套接字代码:

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操作系统不支持SO_REUSEPORT。

有什么办法可以解决吗?欢迎任何建议。

1 个答案:

答案 0 :(得分:0)

谢谢,托尼和超级。似乎宿主应用程序由监视程序进程生成了多个实例,这就是问题发生的原因。解决了。​​