include <sys/un.h>
//本章主要是讲解Unix套接字,这个发明出来就是提高本机中的传输效率,比网络套接字快2倍左右,不需要走过其他类似IP层之类的。
struct sockaddr_un {
sa_family_t sun_family; // 地址族,必须是 AF_UNIX
char sun_path[108]; // 套接字对应的文件路径
};//sunpath大小被明确警示应用程序不应该假设一个特定的长度。应用程序应该再运行时使用sizeof运算符再验证一个路径名是否适合存放到其中的sunpath数组,数组长度很可能在92到108之间,而不是足以存放任何路径名的更大的值
include <stdio.h>
include <stdlib.h>
include <string.h>
include <sys/socket.h>
include <sys/un.h>
include <unistd.h>
int main(int argc, char *argv[]) {
int sockfd;
struct sockaddr_un addr;
socklen_t len;
if (argc != 2) {
fprintf(stderr, "usage: %s <pathname>\n", argv[0]);
exit(1);
}
const char *path = argv[1];
// 1. 创建 UNIX 域套接字
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket error");
exit(1);
}
// 2. 删除旧的 socket 文件
unlink(path); // 不检查错误,正常
// 3. 填充 sockaddr_un 结构
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);
// 4. 绑定 socket 到指定路径
if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind error");
exit(1);
}
// 5. 调用 getsockname() 取回地址
struct sockaddr_un addr_ret;
len = sizeof(addr_ret);
if (getsockname(sockfd, (struct sockaddr *)&addr_ret, &len) < 0) {
perror("getsockname error");
exit(1);
}
// 6. 输出绑定结果
printf("bound name: %s\n", addr_ret.sun_path);
printf("returned len: %d\n", (int)len);
close(sockfd);
return 0;
}
//socketpair函数
int socketpair(int domain, int type, int protocol, int sockfd[2]);
浙公网安备 33010602011771号