C,Bind faild:'地址已经在使用中'

时间:2015-07-07 19:57:55

标签: c network-programming client-server bind

我正在用C编写客户端服务器程序。我在Bind函数中遇到错误:Address Already in Use。所以我厌倦了使用memset(),我得到错误说:Invalid Argument。最后,我在这里查找了类似的问题,其中一些建议使用setsocketopt()函数。我用它而且我收到错误说:

  

/tmp/ccBNsJtU.o:在函数main中:

     

socket.c :(。text + 0xd0):对setsocket

的未定义引用      

collect2:错误:ld返回1退出状态

即使在不同的编程语言中,我也会查看几乎所有相似的问题。现在我被卡住了。我是否必须使用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");
}

2 个答案:

答案 0 :(得分:1)

&#34;已使用的地址&#34;通常意味着某些其他套接字已绑定到给定端口。这可能意味着正在运行的程序主动侦听该端口,或者它可能意味着程序的先前不再运行的实例仍然在操作系统中打开了一些套接字资源。

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

答案 1 :(得分:0)

对于在bind()函数中遇到问题的用户,会产生类型错误:Address Already in Use。这是一个提示:

我的问题是因为程序运行并且bind()使用了一个地址,然后程序生成错误并停止/终止。因此,代码末尾的unlink()函数没有机会完成其工作,并且地址保持使用。最简单的方法是在函数的开头取消链接您将在函数中稍后绑定的进程。

这看起来很简单,我不知道这是不是一个好习惯,但它符合我的目的。