网络编程15

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]);

posted on 2026-03-02 10:38  cyusouyiku  阅读(1)  评论(0)    收藏  举报