77-Unix 域数据报回射服务器

xiaoxiao2021-02-27  302

同样的,这个程序根据之前的 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; // tmpnam 函数用于生成一个随机文件路径 resolve(tmpnam(NULL), &cliaddr, &len); sockfd = socket(AF_LOCAL, SOCK_DGRAM, 0); // 注意,客户端也必须要绑定套接字地址,否则的话,服务器的 recvfrom 函数就得不到客户端的应答路径。 ret = bind(sockfd, (struct sockaddr*)&cliaddr, len); doClient(sockfd); close(sockfd); }

在上面的注释中,已经提到了客户端必须要显式的绑定一个路径名,如果省略这一步,服务器的 recvfrom 将返回一个空路径名。

3. 实验结果

图1 左侧是服务器,右侧是客户端

图2 netstat 输出

图 1 中的服务器输出的路径名,是客户端所绑定的地址,该路径是使用 tmpnam 函数生成的。

4. 总结

知道客户端也需要显式绑定套接字地址
转载请注明原文地址: https://www.6miu.com/read-7651.html

最新回复(0)