【发布时间】: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