加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何使用SOCK_DGRAM制作双向unix域套接字?

发布时间:2020-12-15 22:06:28 所属栏目:安全 来源:网络整理
导读:我正在尝试编写一个简单的Unix数据报服务器/客户端,并且遇到了一些问题.我想要的是一个服务器,它监听数据报套接字并将收到的每条消息的回复发送给原始发送者.我决定首先尝试使用socat作为“服务器”并在C中编写客户端.我正在运行这样的socat: socat UNIX-DG
我正在尝试编写一个简单的Unix数据报服务器/客户端,并且遇到了一些问题.我想要的是一个服务器,它监听数据报套接字并将收到的每条消息的回复发送给原始发送者.我决定首先尝试使用socat作为“服务器”并在C中编写客户端.我正在运行这样的socat:

socat UNIX-DGRAM:/tmp/test.socket,fork EXEC:echo

根据我的理解,这应该监听/tmp/test.socket并回复使用相同字符串收到的所有内容?然后我有一个看起来像这样的客户端程序(为清楚起见,删除了错误检查):

int s = socket(AF_UNIX,SOCK_DGRAM,0);
struct sockaddr_un sa;
sa.sun_family = AF_UNIX;
strcpy(sa.sun_path,"/tmp/test.socket");

const char *data = "Testing data";
int err = sendto(s,data,strlen(data),(struct sockaddr *)(&sa),sizeof(struct sockaddr_un));

printf("Sent!n");

unsigned char *buffer = malloc(BUFFER_LENGTH);
struct sockaddr_storage recv_sa;
int recv_sa_len = 0;
int recv_len = recvfrom(s,buffer,BUFFER_LENGTH,(struct sockaddr *)&recv_sa,&recv_sa_len);

for (int i = 0; i < recv_len; i++) {
    putc(buffer[i],stdout);
}
printf("n");

它应该发送数据包(有效),接收数据包,然后将其打印出来,但程序似乎无法接收数据包.我在这里做错了什么,或者我对Unix套接字有一个根本的误解?谢谢!

解决方法

看一下Michael Kerrisk的AF_UNIX SOCK_DGRAM客户端/服务器程序( client,server)的例子,该程序发表在他的书“Linux编程接口”第57章中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读