c - 为什么我的 unix 域套接字不能工作

标签 c linux sockets unix unix-socket

有两个简单的程序来演示 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]#

这里好像没什么问题。但是,我从服务器上什么也得不到。
我不知道为什么它不能像我预期的那样运行。

最佳答案

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

此外,您不必在客户端中绑定(bind),因此可以从客户端中将其注释掉:

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

关于c - 为什么我的 unix 域套接字不能工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50328319/

相关文章:

c - 编写一个 C 程序,从附带的数据文件中读取整数,并使用插入排序将排序后的数据存储到数组中

java - 我可以使用 java 策略文件通过 sudo 安全地运行不受信任的应用程序吗

linux - 如何执行 shell 脚本并在 ansible 中使用结果

c - 使用 Unix 域套接字进行电话通话的 IPC 机制

sockets - 用另一种编程语言实现node js的步骤

c++ - 我怎样才能创建这个 int 值并处理它?

android - 如何在 Android 中使用没有 Xamarin 的单声道运行 C# 代码?

c - 指向涉及多个 C 源文件的结构的指针

c - Linux 中 chattr 的替代方法

php - 发送具有前导长度值的套接字数据