首页 > 解决方案 > 强制终止并重新生成 TCP 套接字应用程序时无法重用端口

问题描述

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

下面是套接字代码:

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。

有什么办法,我可以解决这个问题吗?欢迎任何建议。

标签: c++raspberry-pi3raspbian

解决方案


谢谢,托尼,超级。似乎主机应用程序有多个由看门狗进程产生的实例,这就是问题发生的原因。已经解决了。


推荐阅读