【问题标题】:why my unix domain socket can't work为什么我的 unix 域套接字无法工作
【发布时间】:2018-10-23 23:53:55
【问题描述】:

有两个简单的程序来演示 unix 域 DGRAM 套接字。

/* server */
int main(int ac, char *av[])
{
    char buf[10];
    int mpLogFD, len;
    struct sockaddr_un serverAddress;

    if((mpLogFD = socket(AF_LOCAL, SOCK_DGRAM, 0)) < 0)
        mpExit("sock");
    unlink(MPLOGD_SOCK);
    memset(&serverAddress, 0, sizeof(serverAddress));
    serverAddress.sun_family = AF_LOCAL;
    strcpy(serverAddress.sun_path, "/var/run/lsvr.sock");
    if(bind(mpLogFD, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) < 0)
        mpExit("bind");
    perror("svr");
    for(;;){
        if(recvfrom(mpLogFD, buf, sizeof(buf), 0, (struct sockaddr *)&serverAddress, &len) < 0)
            mpExit("recv");
        printf("%s\n", buf);
    }
}



/* client */
int main(int ac, char *av[])
{
    int CliFD, len;
    char buf[10];
    struct sockaddr_un cliaddr;

    if((CliFD = socket(AF_LOCAL, SOCK_DGRAM, 0)) == -1)
        mpExit("cli sock");
    memset(&cliaddr, 0, sizeof(cliaddr));
    cliaddr.sun_family = AF_LOCAL;
    strcpy(cliaddr.sun_path, "/var/run/lcli.sock");
    if(bind(CliFD, (struct sockaddr *)&cliaddr, sizeof(cliaddr)))
        mpExit("cli bind");
    len = sizeof(cliaddr);

    sprintf(buf, "12345678\n");

    if(sendto(CliFD, buf, sizeof(buf), 0, (struct sockaddr *)&cliaddr, len) < 0)
        mpExit("cli send");
    perror("cli");
}

结果如下:

[root@jyl opt]# ./logsvr &            
2033
svr: Success  
[root@jyl opt]# ./logcli              
cli: Success  
[root@jyl opt]#

这里似乎没什么问题。但是,我从服务器没有得到任何东西。
不知道为什么不能按预期运行。

【问题讨论】:

  • 在服务器中,有一个缺失的单词'len = sizeof(serverAddress);'。
  • 您的客户端应该发送到 /var/run/lsvr.sock 而不是 /var/run/lsvr.sock
  • @Pras 谢谢你的小费!!!!客户端不应发送到 /var/run/lcli.sock。应该还有一个sockaddr_un,这个路径和serverAddress的路径是一样的。
  • @Pras "to /var/run/lsvr.sock not to /var/run/lsvr.sock" 好吧... ;-)
  • @alk :) 更正了答案

标签: c linux sockets unix unix-socket


【解决方案1】:

你应该发送到/var/run/lsvr.sock而不是/var/run/lcli.sock

另外,您不必在客户端绑定,因此请从客户端将其注释掉:

/*    if(bind(CliFD, (struct sockaddr *)&cliaddr, sizeof(cliaddr)))
            mpExit("cli bind");*/

【讨论】:

  • 谢谢!但是,在将套接字初始化为 unix 域 DGRAM 套接字时,确实需要客户端中的 bind
  • @umbreLLaJYL bind() 在客户端会将您的客户端套接字关联到本地地址/路径(它必须与服务器地址不同),您不会发送到本地地址,您会发送到服务器地址,即您的服务器绑定的地址
  • 客户端中的 bind() 是完成初始化 unix 域套接字所必需的。否则,sendto/write 调用将失败,其错误消息为 No such file or directory
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 2016-07-12
  • 1970-01-01
  • 2010-11-02
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多