您的位置:首页 > 理论基础 > 计算机网络

常用的几个网络api

2017-11-30 18:24 218 查看
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表示的连接上的本地地址 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: