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

同样的,这个程序根据之前的 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. 总结

  • 知道客户端也需要显式绑定套接字地址
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值