C、绑定(bind)失败: `Address Already in Use`

标签 c network-programming client-server bind

我正在用 C 语言编写客户端-服务器程序。我在 Bind 函数中收到错误消息:地址已在使用中。所以我厌倦了使用 memset() 并且收到错误消息:Invalid Argument。最后,我在这里寻找类似的问题,其中一些建议使用setsocketopt()函数。我使用了它,但收到错误消息:

/tmp/ccBNsJtU.o: In function main:

socket.c:(.text+0xd0): undefined reference to setsocket

collect2: error: ld returned 1 exit status

即使不是使用不同的编程语言,我也研究了几乎(如果不是所有)类似的问题。现在我被困住了。我是否必须使用setsocket(),如果我这样做,是否会导致我的代码出现问题?或者我不必使用它而问题出在其他地方?问题可能出在我监听和发送消息的客户端或服务器功能中吗?这是bind() 和setsocket() 函数所在的代码部分:

int main (void) {
int sl, sa, bn, erro, lis;
int status;

//server log socket
struct sockaddr_un server = {AF_UNIX, "log_server"};
sl = socket (AF_UNIX, SOCK_STREAM, 0);
if(sl < 0) {
perror("Faild to create socket - in main");
    exit(1);
}

//I added this part
if (setsocket(sl, SOL_SOCKET, SO_REUSEADDR, &server, sizeof(server)) == -1) {
    perror("setsocket - in main");
    exit(1);
}
bn = bind (sl, (struct sockaddr *)&server, sizeof(server));
if(bn < 0){
    perror("Faild to bind - in main");
    exit(1);
}
lis = listen (sl, 1); //to be changed to 4
if (lis < 0) {
    perror("Faild to listen - in main");
}

最佳答案

“地址已在使用中”通常意味着某个其他套接字已绑定(bind)到给定端口。这可能意味着有一个正在运行的程序正在积极监听该端口,或者可能意味着不再运行的程序的先前实例仍然在操作系统中打开了一些套接字资源。

在后一种情况下,使用 SO_REUSEADDR 参数调用 setsockopt(不是 setsocket)将解决此问题。第四个参数应该是一个指向 char 的指针,其值为 1,而第五个参数应该是 sizeof(char)

关于C、绑定(bind)失败: `Address Already in Use` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31278156/

相关文章:

c - 我什么时候应该在 C 中使用 free()?

linux - nftables 配置命令失败,不支持操作

Java相互认证-客户端服务器

c - 如何确定 C 中的 Unix 文本文件?

arrays - Linux需要多长时间清理堆内存

无法创建整数数组来保存字符

python - 金融传染(疫情蔓延)模型遇到问题

c - 如何用 C 创建 BACnet 客户端

java - Java 中的客户端服务器程序(没有正确的输出)[没有错误]

android - 处理断开的网络连接的最佳策略?