使用Unix套接字获取“已使用的地址”错误

时间:2013-07-03 15:23:06

标签: c sockets unix-socket

使用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;
}

3 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:0)

经过很长一段时间我写这个问题后,我正在写作。但是,对于那些仍在寻找可能的解决方案的人来说,这是我的经验。

我正在开发基于Linux的服务器并创建一个套接字作为IPC。我得到了类似的错误,但这是因为我通过终端运行了可执行文件而没有使用关键字'sudo'。

希望这有帮助。

答案 2 :(得分:-4)

您可以尝试使用SO_REUSEADDR标志,如下所示:

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