1.通过网址获取ip
头文件<netdb.h>struct hostent *gethostbyname(const char *name); 返回一个目的主机的结构体
struct hostent
{
char *h_name; //正式主机名
char **h_aliases; //主机别名
int h_addrtype; //主机IP地址类型:IPV4-AF_INET
int h_length; //主机IP地址字节长度,对于IPv4是四字节,即32位
char **h_addr_list; //主机的IP地址列表
};
#define h_addr h_addr_list[0] //保存的是IP地址
h_addr 保存了目的主机的ip不好意思他是一个网络序 并且是char*的数据 所以先要转成网络 序才能去转
#include <iostream>
#include <cstdio>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
using namespace std;
int main()
{
struct hostent* host = NULL;
sockaddr_in caddr;
char www[20]="";
fgets(www,20,stdin);//多读个回车
www[strlen(www)-1]='\0';
cout<<www<<endl;
host = gethostbyname(www);
if(host==NULL)
{
return 0;
}
cout<<host->h_name<<endl;
printf("IP Address : %s\n",inet_ntoa(*((struct in_addr *)host->h_addr)));
// 网络字节转字符串
//cout<<ip<<endl;
return 0;
}
~
程序如上 对于 in_addr 主机序 的结构体我理解位里面只有一个类似string的结构体所以 我们当时写的是这个东西所以直接转换就强转就行了;
printf("IP Address : %s\n",inet_ntop(host->h_addrtype,host->h_addr,ip,sizeof(ip))); 这个api也可以
2.通过套接字获取到该套接字的端口和ip
获取本地协议的地址
getsockname(listenfd, (struct sockaddr *)&listendAddr, &listendAddrLen);
using namespace std;
9 int main()
10 {
11 struct hostent* host = NULL;
12 struct sockaddr_in caddr,saddr;
13 int socketfd=socket(AF_INET,SOCK_STREAM,0);
14 memset(&caddr,0,sizeof(caddr));
15 caddr.sin_family=AF_INET;
16 caddr.sin_port=htons(8888);
17 caddr.sin_addr.s_addr=inet_addr("10.104.238.147");
18 int res=bind(socketfd,(sockaddr *)&caddr,sizeof(caddr));
19 listen(socketfd,5);
20 socklen_t len=sizeof(saddr);
21 getsockname(socketfd,(sockaddr*)&saddr,&len);
22 cout<<"1 "<<inet_ntoa(saddr.sin_addr)<<" ";
23 cout<<"2 "<<ntohs(saddr.sin_port)<<endl;
实际如图所示
getpeername函数用于获取与某个套接字关联的外地协议地址
getpeername(connfd, (struct sockaddr *)&connectedAddr, &connectedAddrLen);//获取connfd表示的连接上的本地地址