【问题标题】:C, Bind faild: `Address Already in Use`C、绑定失败:`地址已在使用中`
【发布时间】:2015-07-07 19:57:54
【问题描述】:

我正在用 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");
}

【问题讨论】:

  • 您至少描述了 3 个不同(且大多不相关)的问题。
  • @EugeneSh。嗯,我会改写我的问题,只包括一个问题。

标签: c network-programming client-server bind


【解决方案1】:

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

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

【讨论】:

  • 为什么in第四个参数应该是指向char的指针?我看到许多其他问题和答案指向struct sockaddr_un 而不是字符!
  • setsockopt 用于各种函数,所以第四个参数指向什么完全取决于第三个参数。当第三个参数是SO_REUSEADDR 时,第四个应该是指向char 的指针。
  • 是否假设创建一个值为 1 的字符并使用它?或者我必须从其他地方获取它,比如来自其他调用的返回值?
  • 这个选项是启用/禁用的,所以char reuse = 1和setsockopt(sl, SOL_SOCKET, SO_REUSEADDR, &amp;reuse, sizeof(reuse))
【解决方案2】:

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

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

这看起来很简单,我不知道这是否是一个好习惯,但它对我的目的有效。

【讨论】:

    猜你喜欢
    • 2013-02-18
    • 2018-04-01
    • 1970-01-01
    • 2019-07-29
    • 2013-12-02
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多