Linux 套接字socket与地址查询

先介绍一下如何获取主机名和服务名吧!

用hostname命令可以获取主机名

Linux 套接字socket与地址查询

那如何获取服务名呢?

通过这个命令systemctl list-unit-files 可以获取系统服务

Linux 套接字socket与地址查询

来了解一个服务,nfs服务。

NFS (Network File System) 即网络文件系统。一种使用于分散式文件系统的协定,功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。

 

有时候我们需要直接获取一个地址结构。用什么办法呢?

用getaddrinfo 函数

#include<sys/socket.h>

#include<netdb.h>

int getaddrinfo(const char* host,const char* service,const struct addrinfo *hint,struct addrinfo **res);

void freeaddrinfo(struct addrinfo *ai);

提供一个主机名和服务名 给第一参数 第二参数

第三参数是一个 addrinfo 结构的指针。这个结构名暂且叫hint,它起到过滤作用。

第四参数是一个 指向addrinfo指针的 指针。是一个链表结构,一个存储addrinfo指针的链表

Linux 套接字socket与地址查询

那一个addrinfo 结构有蕴含什么信息?

int ai_flags  //指定了这个addrinfo的行为

(AI_CANONNAME 需要一个规范名字

 AI_ALL 寻找IPV4 IPV6地址

 AI_ADDRCONFIG 查询配置的地址类型

...etc)

int ai_family //地址族

int ai_socktype //套接字类型

int ai_protocol //协议类型

socklen_t ai_addrlen //地址长度

struck sockaddr *ai_addr //地址结构

char *ai_canonname //

struct addrinfo *ai_next

...etc

还有一个函数与之相反是通过一个地址获得主机名和服务名

#include<sys/socket.h>

#include<netdb.h>

 int getnameinfo(const struct sockaddr *addr,socklen_t alen,

 char* host,socklen_t hostlen,

 char* service,socklen_t servlen,int flags);

 

还有一些其他的类似结构体

hostent 主机信息的

netent 网络信息的

protoent 协议信息的

servent 服务信息的