获取主机信息,网络信息AIP,getsockname,getpeername,getservbyname,getservbyport,inet_ntop,inet_pton
获取主机信息
1.ip地址转换,主机字节序 <---> 网络字节序
#include <arpa/inet.h> int inet_pton(int af, const char* src, void* dst); const char* inet_ntop(int af, const void* src, char* dst, socklen_t cnt)
inet_pton函数将用字符串表示的IP地址src(用淀粉十进制字符串表示的IPv4地址或用十六进制字符串表示的IPv6地址)转换成用网络字节序整数表示的IP地址,并把转换结果存储于dst指向的内存中。
其中,af 参数指定地址族,可以使AF_INET或者AF_INET6.inet_pton成功时返回1,失败时返回0,病设置errno。
inet_ntop函数进行相反的转换,前3个参数含义与inet_pton的参数相同,最后一个参数cnt指定目标存储单元的大小。成功时返回目标存储单元的地址,失败则返回NULL并设置errno。
这个头文件里面定义了“目标存储单元的大小”
#include <netinet/in.h>
#define INET_ADDRESSLEN 16
#define INET6_ADDRESSLEN 46
2.地址信息函数:
#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr* address, socklen_t* address_len);
int getpeername(int sockfd, struct slckaddr* address, socklen_t* address_len);
getsockanme获取sockfd对应的本端socket地址,并将其存储于address参数指定的内存中,该socket地址的长度则存储于address_len参数指向的变量中。如果实际socket地址的长度大于address所指内存区的大小,那么该socket地址将被截断。getsocketname成功时返回0,失败则返回-1,并设置errno。
getpeername获取sockfd对应的远端socket地址,其参数及返回值的含义与getsockname的参数及返回值相同。
3.网络信息AIP
#include <netdb.h>
struct hostent* gethostbyname(const char* name);
struct hostent* gethostbyaddr(const void* addr, size_t len, int type); struct hostent
{
char* h_name;
char** h_aliases;
int h_addrtype;
int h_length;
char** h_addr_list;//按网络字节序列出的主机IP地址列表
};
gethostbyname 函数根据主机名称获取主机的完整信息,
gethostbyaddr函数根据IP地址获取主机的完整信息。
gethostbyname函数通常先在本地的 /etc/hsots配置的文件中查找主机,
如果没有找到,再去访问DNS服务器。
#include <netdb.h>
struct servent* getservbyname(const char* name, const char* proto);
struct servent* getsrvbyport(int port, const char* proto); struct servent
{
char* s_name;
char** s_aliases;
int s_port;
char* s_proto;
};
getservbyname函数根据名称获取某个服务的完整信息,
getsrvbyport函数根据端口号获取某个服务的完整信息。
他们实际上都是通过读取 /etc/services 文件来获取服务信息的
#include <netdb.h>
int getaddrinfo(const char* hostname, const char* service, const struct addrinfo* hints, struct addrinfo** result) struct addrinfo
{
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklent_t ai_addrlen;
char* ai_canonname;
struct sockaddr* ai_addr;
struct addrinfo* ai_next;
};
getaddrinfo函数既能通过主机名获取ip地址也能通过服务名获得端口号。
#include <netdb.h>
int getnameinfo(const struct sockaddr* sockaddr, socklen_t addrlen, char* host, socklen_t hostlen, char* serv, socklen_t servlen, int flags);
getnameinfo函数能通过socket地址同时获得以字符串表示的主机名和服务名。
4.举例说明:
举个例子A:
const char* ip = argv[];
int port = atoi(argv[]);
int backlog = atoi(argv[]); int sock = socket(PF_INET, SOCK_STREAM, );
assert(socket >= ); // create a ipv4 socket address
struct sockaddr_in address;
bzero(&address, sizeof(address));
address.sin_family = AF_INET;
inet_pton(AF_INET, ip, &address.sin_addr);
address.sin_port = htons(port);
举个例子B:
if(connect(sock, (struct sockaddr*)&serverSocket, sizeof(serverSocket)) != -)
{
char buffer[BUFFER_SIZE];
memset(buffer, '\0', sizeof(buffer));
send(sock, buffer, BUFFER_SIZE, ); //client get server(peer) name
struct sockaddr_in peerHost;
socklen_t client_addrlength = sizeof(peerHost);
getpeername(sock, (struct sockaddr*)&peerHost, &client_addrlength );
char dest[] ;
inet_ntop(AF_INET, &peerHost.sin_addr,dest,);
int peerPort=ntohs(peerHost.sin_port);
printf("dest ip : %s, port:%d", dest, peerPort);
}
举个例子C:(完整版. 客户端)
#include <sys/socket.h>
#include <arpa/inet.h>
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h> #define BUFFER_SIZE 512 int main(int argc, char* argv[])
{
if(argc<=)
{
printf("usage: %s ip_address, port_number send_buffer_size \r\n", basename(argv[]));
return ;
} char* ip = argv[];
int port = atoi(argv[]); struct sockaddr_in serverSocket;
bzero(&serverSocket, sizeof(serverSocket)); serverSocket.sin_port = htons(port);
serverSocket.sin_family = AF_INET;
inet_pton(AF_INET, ip , &serverSocket.sin_addr); int sock = socket(PF_INET, SOCK_STREAM, );
assert(sock>=); int sendBuf =atoi(argv[]);
int len = sizeof(sendBuf);
//set tcp buff ,and read
setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &sendBuf, sizeof(sendBuf));
getsockopt(sock, SOL_SOCKET, SO_SNDBUF, &sendBuf, (socklen_t*)&len);
printf("the tcp send buffer size after setting is %d.\r\n", sendBuf); if(connect(sock, (struct sockaddr*)&serverSocket, sizeof(serverSocket)) != -)
{
char buffer[BUFFER_SIZE];
memset(buffer, '\0', sizeof(buffer));
send(sock, buffer, BUFFER_SIZE, ); //client get server(peer) name
struct sockaddr_in peerHost;
socklen_t client_addrlength = sizeof(peerHost);
getpeername(sock, (struct sockaddr*)&peerHost, &client_addrlength );
char dest[] ;
inet_ntop(AF_INET, &peerHost.sin_addr,dest,);
int peerPort=ntohs(peerHost.sin_port);
printf("dest ip : %s, port:%d", dest, peerPort);
} close(sock); return ;
}
举个例子D:完整版(服务器)
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h> #define BUFFER_SIZE 1024 int main(int argc, char* argv[])
{
if(argc<=)
{
printf("suage:%s IP_number port_number recv_buffer.\r\n", basename(argv[]));
return ;
} char* ip = argv[];
int port = atoi(argv[]); struct sockaddr_in serverAddr;
bzero(&serverAddr,sizeof(serverAddr)); serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(port);
inet_pton(AF_INET,ip, &serverAddr.sin_addr); int sockfd = socket(PF_INET, SOCK_STREAM,);
assert(sockfd>=); int recvbuf = atoi(argv[]);
int len = sizeof(recvbuf);
//set tcp bufsize,then read it.
setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &recvbuf, sizeof(recvbuf));
getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &recvbuf, (socklen_t*)&len);
printf("The tcp receive buffer size after setting is %d.\r\n", recvbuf); int ret = bind(sockfd, (struct sockaddr*)&serverAddr,sizeof(serverAddr));
assert(ret>=); ret = listen(sockfd, );
assert(ret>=); struct sockaddr_in client;
socklen_t client_addrlength = sizeof(client);
int connfd = accept(sockfd, (struct sockaddr*)&client, &client_addrlength);
if(connfd < )
{
printf("errno is:%d \r\n", errno);
}
else
{
char buffer[BUFFER_SIZE];
memset(buffer,'\0', sizeof(buffer));
while(recv(connfd, buffer, BUFFER_SIZE-, ) > )
{
printf("recv success...");
} close(connfd);
} close(sockfd); return ;
}
举个例子E:完整版(访问某个开启了daytime的主机)
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <assert.h> int main(int argc, char* argv[])
{
assert(argc ==);
char* host = argv[];
//get dest host ip info
struct hostent* hostinfo = gethostbyname(host);
assert(hostinfo); //get daytime info
struct servent* servinfo = getservbyname("daytime", "tcp");
assert(servinfo); //// attention the struct convert
struct in_addr pNetIp = *(struct in_addr*)*hostinfo->h_addr_list;
char serverHostIp[] ;
inet_ntop(AF_INET, &pNetIp, serverHostIp, ); printf("server host ip:[%s].daytime port is %d.\r\n",serverHostIp, ntohs(servinfo->s_port)); struct sockaddr_in address;
bzero(&address, sizeof(address));
address.sin_family = AF_INET;
address.sin_port = servinfo->s_port; // Attention! directly use servent
address.sin_addr = *(struct in_addr*)*hostinfo->h_addr_list; int sockfd = socket(AF_INET, SOCK_STREAM, );
int result = connect(sockfd, (struct sockaddr*)&address, sizeof(address));
assert(result != -); char buffer[];
result = read(sockfd, buffer, sizeof(buffer));
assert(result > );
buffer[result] = '\0';
printf("the day time is: %s", buffer); close(sockfd);
return ;
}
获取主机信息,网络信息AIP,getsockname,getpeername,getservbyname,getservbyport,inet_ntop,inet_pton的更多相关文章
- Qt5获取本机网络信息
获取本机网络信息 在pro文件中加入如下代码 QT += network widget.h中的代码如下 #ifndef WIDGET_H #define WIDGET_H #include <Q ...
- Linux下通过ioctl系统调用来获取和设置网络信息
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...
- Qt-网络与通信-获取本机网络信息
在网络应用中,经常需要获取本机主机名和IP地址和硬件地址等信息.运用QHostInfo.QNetworkInterface.QNetworkAddressEntry可以获得本机的网络信息. 上运行截图 ...
- Qt网络获取本机网络信息
下面我们就讲解如何获取自己电脑的IP地址以及其他网络信息.这一节中,我们会涉及到网络模块(QtNetwork Module)中的QHostInfo ,QHostAddress ,QNetworkInt ...
- Qt - 获取本机网络信息
目的: 获取本机的主机名.IP地址.硬件地址等网络信息. 工具: 使用Qt提供的网络模块QtNetwork(pro文件里面加network): 使用Qt提供的类QHostInfo.QNetworkIn ...
- Linux中获取本机网络信息的几个函数及应用
一.读取/etc/hosts 几个函数 头文件<netdb.h> 1.void sethostent(int stayopen);//开打/etc/hosts 配置文件 2.struct ...
- Qt之获取本机网络信息(MAC, IP等等,很全)
经常使用命令行来查看一些计算机的配置信息. 1.首先按住键盘上的“开始键+R键”,然后在弹出的对话框中输入“CMD”,回车 另外,还可以依次点击 开始>所有程序>附件>命令提示符 2 ...
- Qt之获取本机网络信息(超详细)
经常使用命令行来查看一些计算机的配置信息. 1.首先按住键盘上的“开始键+R键”,然后在弹出的对话框中输入“CMD”,回车 另外,还可以依次点击 开始>所有程序>附件>命令提示符 2 ...
- qt获取本机网络信息
networkinformation.h #include<QtGui/QWidget> #include<QLabel> #include<QPushButton> ...
随机推荐
- 【Linux命令】文件目录管理命令7个(touch、mkdir、cp、mv、rm、dd、file)
目录 touch创建空白文档或设置文件时间 mkdir创建空白目录 cp复制文件或目录 mv剪切文件或重命名文件 rm删除文件或目录 dd按照指定大小和个数的数据库来复制文件或转换文件 file查看文 ...
- Linux 安装指定版本Git
git二进制文件下载地址: https://mirrors.edge.kernel.org/pub/software/scm/git/ 1.下载v2.21.0版本 wget https://mirro ...
- SpringBoot中数据加密存储和获取后解密展示AttributeConverter的实现
1. 需求: 数据库存入数据的时候要加密处理,不同的字段加密方式不同. 界面上展示的时候要解密处理,解密方式相同. 2. 实现方案一: 定义公共的加密解密方法,然后在对应的字段上重写他的getset方 ...
- centos 配置sentry+钉钉+邮件通知
1.sentry官方推荐docker方式安装.使用docker-compose,最好是centos7 2.卸载旧版本 yum remove docker docker-common docker-se ...
- js 时分秒转化为秒
var time = '00:02:10'; var hour = time.split(':')[0]; var min = time.split(':')[1]; var sec = time.s ...
- Linux命令大全|linux常用命令
系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...
- [b0019] python 归纳 (五)_类装饰器
总结: 类装饰器, 本质是一个函数,输入一个类,返回一个类 Case 1 啥都没做 def deco(in_class): return in_class @deco class Cat: def _ ...
- java:数据结构(四)二叉查找树以及树的三种遍历
@TOC 二叉树模型 二叉树是树的一种应用,一个节点可以有两个孩子:左孩子,右孩子,并且除了根节点以外每个节点都有一个父节点.当然这种简单的二叉树不能解决让树保持平衡状态,例如你一直往树的左边添加元素 ...
- Visual Studio Code 配置 EasyLESS,如果想用less,但又不想在组件中直接添加 style 时可以参考
在用 vue 画页面时,如果想用less,但又不想在组件中直接添加 style ,可以使用 vs code 的插件:EasyLess EasyLess 安装好后必须在 setting.json 中对它 ...
- python测试mysql写入性能完整实例
这篇文章主要介绍了python测试mysql写入性能完整实例,具有一定借鉴价值,需要的朋友可以参考下 本文主要研究的是python测试mysql写入性能,分享了一则完整代码,具体介绍如下. 测试环境: ...