c++ - 强制终止并重新生成 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。
有什么办法,我可以解决这个问题吗?欢迎任何建议。
解决方案
谢谢,托尼,超级。似乎主机应用程序有多个由看门狗进程产生的实例,这就是问题发生的原因。已经解决了。
推荐阅读
- amazon-web-services - 如何在 AWS EKS 上托管的 pod 内挂载外部 Windows 文件共享?
- r - 将一个数据集中一列中的数值转换为不同数据集上对应的文本值
- json - 如何修复错误不获取数据?在 swift 和 Laravel api 中
- visual-studio-code - 如何在 VS Code 的文件夹中找到短语
- ssrs-2016 - 如何将报告的标题更改为与 .rdl 文件名不同
- java - 如何根据用户输入改变活动数量?
- asp.net-core - RedisTimeoutException 使我的 aspnet 核心应用程序崩溃
- php - 使用 $_SESSION 中的数据编写 SQL 查询
- javascript - 加速 Starfield Canvas 动画并对其进行控制
- javascript - 使用 CSS 动画在页面加载后将元素隐藏 n 秒