同样的,这个程序根据之前的 UDP 回射服务器改写。
1. 程序路径
程序路径:
git clone https://git
.oschina.net/ivan_allen/unp
.git
如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是 unp/program/unixdomainprotocols/echo_datagram.
2. 伪代码
服务器
void server_routine() {
int ret, sockfd;
struct sockaddr_un servaddr, cliaddr;
socklen_t
len;
resolve(g_option.path, &servaddr, &
len);
sockfd = socket(AF_LOCAL, SOCK_DGRAM,
0);
unlink(g_option.path);
ret = bind(sockfd, (
struct sockaddr*)&servaddr,
len);
doServer(sockfd);
close(sockfd);
}
客户端
void client_routine() {
int sockfd, ret;
struct sockaddr_un cliaddr;
socklen_t
len;
resolve(tmpnam(NULL), &cliaddr, &
len);
sockfd = socket(AF_LOCAL, SOCK_DGRAM,
0);
ret = bind(sockfd, (
struct sockaddr*)&cliaddr,
len);
doClient(sockfd);
close(sockfd);
}
在上面的注释中,已经提到了客户端必须要显式的绑定一个路径名,如果省略这一步,服务器的 recvfrom 将返回一个空路径名。
3. 实验结果
图1 左侧是服务器,右侧是客户端
图2 netstat 输出
图 1 中的服务器输出的路径名,是客户端所绑定的地址,该路径是使用 tmpnam 函数生成的。
4. 总结
知道客户端也需要显式绑定套接字地址