c - 为什么我的 unix 域套接字无法工作
问题描述
有两个简单的程序来演示 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
。
此外,您不必在客户端绑定,因此请从客户端将其注释掉:
/* if(bind(CliFD, (struct sockaddr *)&cliaddr, sizeof(cliaddr)))
mpExit("cli bind");*/
推荐阅读
- javascript - Javascript - 对象中的变量
- sql - MS Access(或 SQL)查询:等效于水平 CountIf()
- reactjs - 使用 Ionic 5 动画 API 的模态或弹出式/弹出式路由转换
- python - 没有找到使用 selenium 的表
- android - PDFMake:无法在 android 设备上保存 pdf 文件
- java - 当文件的名称可以采用不同的编码时,如何查找文件?
- reactjs - 缓存问题:CDN 后面的 React + REST 服务器
- ios - 如何以编程方式快速重新采样音频文件?
- mysql - CloudStack 无法创建与数据库服务器的连接
- youtube-data-api - 如何从频道名称中找到频道信息?