【发布时间】:2019-05-28 14:01:02
【问题描述】:
我有一个应用程序充当另一个应用程序的看门狗。看门狗的职责是监视宿主应用程序的存在并在它死亡时重新启动它。
下面是socket代码:
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。
有什么办法,我可以解决这个问题吗?欢迎提出任何建议。
【问题讨论】:
-
也许看看 SO_LINGER - 见here
-
等待几分钟,然后重试。
-
谢谢,托尼,超级感谢。似乎主机应用程序有多个由看门狗进程产生的实例,这就是问题发生的原因。已经解决了。
标签: c++ raspberry-pi3 raspbian