如何在 PF_UNIX 套接字的服务器端打印客户端 sun_paths 名称?
How can I print client sun_paths name at server side in PF_UNIX socket?
#define NAME "server"
main()
{
int sock, msgsock, rval;
int pid,len;
struct sockaddr_un server,clientv;
char bufRead[1024];
char bufWrite[1024];
unlink(NAME);
sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock < 0)
{
perror("opening stream socket");
exit(1);
}
server.sun_family = AF_UNIX;
strcpy(server.sun_path, NAME);
if (bind(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)))
{
perror("binding stream socket");
exit(1);
}
printf("Socket has name %s\n", server.sun_path);
listen(sock, 5);
msgsock = accept(sock, (struct sockaddr *)&clientv, &len);
if (msgsock == -1)
perror("accept");
printf("clientv add %s\n",clientv.sun_path);
}
但是当我连接客户端时给出输出:
Socket has name server
clientv add LK�ĿX�MK
accept() 没有填写.sun_path,所以你需要使用getsockname() 手动获取它。应该是这样的:
struct sockaddr_storage storage;
socklen_t storage_len = sizeof(struct sockaddr_storage);
struct sockaddr_un *clientv = (struct sockaddr_un *)&storage;
if (0 == getsockname(sock, (struct sockaddr *)&clientv, &storage_len)) {
printf("clientv add %s\n", clientv.sun_path);
}
#define NAME "server"
main()
{
int sock, msgsock, rval;
int pid,len;
struct sockaddr_un server,clientv;
char bufRead[1024];
char bufWrite[1024];
unlink(NAME);
sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock < 0)
{
perror("opening stream socket");
exit(1);
}
server.sun_family = AF_UNIX;
strcpy(server.sun_path, NAME);
if (bind(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)))
{
perror("binding stream socket");
exit(1);
}
printf("Socket has name %s\n", server.sun_path);
listen(sock, 5);
msgsock = accept(sock, (struct sockaddr *)&clientv, &len);
if (msgsock == -1)
perror("accept");
printf("clientv add %s\n",clientv.sun_path);
}
但是当我连接客户端时给出输出:
Socket has name server
clientv add LK�ĿX�MK
accept() 没有填写.sun_path,所以你需要使用getsockname() 手动获取它。应该是这样的:
struct sockaddr_storage storage;
socklen_t storage_len = sizeof(struct sockaddr_storage);
struct sockaddr_un *clientv = (struct sockaddr_un *)&storage;
if (0 == getsockname(sock, (struct sockaddr *)&clientv, &storage_len)) {
printf("clientv add %s\n", clientv.sun_path);
}