代码之家  ›  专栏  ›  技术社区  ›  Beh_12517843

bind:无效参数AF_UNIX

  •  0
  • Beh_12517843  · 技术社区  · 6 月前

    服务器。c

    #include <stdio.h>
    #include <sys/socket.h>
    #include <string.h> 
    #include <myhead.h>
    #include <unistd.h>
    int main() {
      int unix_socket = socket(AF_UNIX,SOCK_STREAM,0);
      perror("");
      struct sockaddr_un behS;
      memset(&behS,0,sizeof(struct sockaddr_un));
      behS.sun_family= AF_UNIX;
      perror("");
      strlcpy(behS.sun_path,"hello_c",1024);
      perror("");
      printf("%i\n",unix_socket);
      perror("");
      int wth = bind(unix_socket,
        (struct sockaddr *)&behS,
        sizeof(behS));
      perror("");
      return 0;
    }
    

    我的头。h

    struct sockaddr_un {
      short sun_family;
      char sun_path[1024];
    };
    

    输出

    Success
    Success
    Success
    3
    Success
    Invalid argument
    

    代码很简单,为什么它不起作用 编辑: 我将代码更新为现在的代码,并将myhead.c修复为myhead.h(键入错误)

    1 回复  |  直到 6 月前
        1
  •  0
  •   G.M.    6 月前

    从手册页 bind 通话中可能出现错误 bind(sockfd, const addr, addrlen) 是。。。

    EINVAL addrlen is wrong, or addr is not a valid address for this socket's domain.
    

    你的 struct sockaddr_un 定义是。。。

    struct sockaddr_un {
      short sun_family;
      char sun_path[1024];
    };
    

    然而,典型的定义(再次,来自相关 man page )会像。。。

    struct sockaddr_un {
      sa_family_t sun_family;               /* AF_UNIX */
      char        sun_path[108];            /* Pathname */
    };
    

    既然如此, sizeof(behS) 在你自己的代码中几乎肯定不会返回预期的值,你会得到一个 EINVAL .

    解决方案是简单地使用以下定义 结构体sockaddr_un 提供于 sys/un.h .