gpt4 book ai didi

c - setsockopt() 不解除绑定(bind)

转载 作者:行者123 更新时间:2023-11-30 14:36:34 26 4
gpt4 key购买 nike

以下 C 语言服务器无法按预期工作。第一次运行时,没有出现任何问题。每次您下次运行它时,它都无法绑定(bind)。无论 setsockopt(...) 是否成功,有些人可能会标记为重复的问题的解决方案也不起作用。

#include <stdio.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>


#define PORT 8080
#define SA struct sockaddr

int main() {

int sockfd, connfd;
struct sockaddr_in servaddr, cli;

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1) puts("Socket creation failed."), exit(0);
else puts("Socket created.");

const int optVal = 1;
const socklen_t optLen = sizeof(optVal);
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optVal, optLen);

servaddr.sin_family = AF_INET, servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

if (bind(sockfd, (SA *) &servaddr, sizeof(servaddr))) {
puts("Bind failed.");
shutdown(sockfd, 2);
return 12;
}
else puts("Bound.");

if(listen(sockfd, 5)) puts("Listen failed."), exit(2);
else puts("Listening: ");
int len = sizeof(cli);

connfd = accept(sockfd, (SA*)&cli, &len);
if(connfd < 0) puts("Connection failed."), exit(3);
else puts("Accepted.");

close(connfd);
return 0;
}

到目前为止我尝试过的事情:

  1. 使用setsockopt(...)没有效果
  2. shutdown(...) 也不起作用
  3. closesocket(...) 是 Windows API 的一部分,我只是无意使用它
  4. 如果我决定忽略“地址已在使用中”错误,accept(...) 将失败并显示参数无效<

如果重要的话,我在 Windows 10 下将 CLion 与 cygwin 结合使用。

最佳答案

“如果重要的话,我会在 Windows 10 下使用 CLion 和 cygwin。”

我强烈怀疑这很重要。

当我完全按照您发布的方式编译您的代码时,它的行为会根据您想要的/预期的行为。

当我注释掉setsockopt()调用时,我需要等到TIME_WAIT过期才能重新绑定(bind)相同的地址+端口,即也在意料之中。

我在 macOS 上使用 gcc,因此我怀疑您的编译和/或运行时环境与您的代码未按预期工作有关。如果您无法访问物理 Linux 计算机,并且无法在您拥有的 Windows 计算机上设置双启动,则可以验证这一点的一种方法是在 Digital Ocean 启动一个小型 Linux 实例, AWS 或其他一些云提供商。

编辑#1

我在 DO Linux 主机上重复了此操作,并且我已确认您的原始代码按预期工作。

关于c - setsockopt() 不解除绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57975704/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com