【问题标题】:Getting "Address already in use" error using Unix socket使用 Unix 套接字获取“地址已在使用”错误
【发布时间】:2013-07-01 09:04:20
【问题描述】:

使用 Unix 本地套接字编写下面的 C 源代码时,我收到一个关于地址已在使用中的错误。在检查了man 7 Unix 以获取更多信息后,我尝试创建一个子文件夹来执行我的程序(显然修改了当前文件夹上的sun_path 字段),但错误始终相同。

有人可以帮助我吗?

源代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <unistd.h>
#include <errno.h>

#define MAXLEN  128

int main (int argc, char *argv[]){

        struct sockaddr_un      server;
        int                                     serverfd, clientfd;
        socklen_t                       addrsize = sizeof(struct sockaddr_un);
        char                            buff[MAXLEN], *path;

        if (argc < 2){
                printf("Error: %s [MESSAGE]\n", argv[0]);
                return 1;
        }

        if ((serverfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
                printf("Error \"%s\" in socket()\n", strerror(errno));
                exit(1);
        }
        puts("socket()");

        server.sun_family = AF_UNIX;
        path = strcpy(server.sun_path, "/home/myhome/Dropbox/Sources/C/sub");

        printf("[DEBUG]Address bound at %s\n", path);

        if ((bind(serverfd, (struct sockaddr*)&server, addrsize)) < 0){
                printf("Error \"%s\" in bind()\n", strerror(errno));
                exit(1);
        }
        puts("bind()");


        if ((listen(serverfd, 1)) < 0){
                printf("Error \"%s\" in listen()\n", strerror(errno));
                exit(1);
        }

        if ((clientfd = accept(serverfd, NULL, &addrsize)) < 0){
                printf("Error \"%s\" in accept()\n", strerror(errno));
                exit(1);
        }

        write(clientfd, argv[1], strlen(argv[1]));
        read(clientfd, buff, sizeof(buff));

        puts(buff);

        close(clientfd);
        close(serverfd);
        return 0;
}

【问题讨论】:

  • 请发布您看到的确切错误消息。
  • 显示的错误是这样的:“bind() 中的错误“地址已在使用中””
  • 嘿,不要为 AF_UNIX 使用保管箱文件系统。它确实需要是一个本地文件系统。你可以google一下为什么。这里有龙,所以除非你在本地文件系统上尝试并重现它,否则我认为没有人可以帮助你。
  • 这听起来很奇怪,因为 Dropbox 文件夹位于我的文件系统上。反正我要试试。
  • 另外,如果文件存在,您确定取消链接吗? beej.us/guide/bgipc/output/html/multipage/unixsock.html

标签: c sockets unix-socket


【解决方案1】:

您应该在bind 调用之前unlink() path 文件。当文件在bind 期间存在时,您将收到此错误。您应该确保在退出应用程序之前取消链接/删除文件,或者您始终可以在绑定之前取消链接。

查看bind 的手册页。另外,请注意最后手册页中给出的示例。

【讨论】:

  • 是的,我也看到了这个
  • 是的,刚刚尝试过,它可以工作。无论如何,感谢这两个和 +1 到 xaxxon。
【解决方案2】:

您可以尝试像这样使用 SO_REUSEADDR 标志:

int yes = 1;
if (setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
    // error handling
    exit(1);
}

【讨论】:

  • 我读过一些东西,虽然没有明确定义,但它对非网络协议没有意义。
猜你喜欢
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 2016-09-22
  • 2012-03-04
  • 1970-01-01
  • 2012-03-01
  • 2018-01-30
  • 2021-05-21
相关资源
最近更新 更多