zoukankan      html  css  js  c++  java
  • Linux下的C Socket编程 -- 获取对方IP地址

    Linux下的C Socket编程(二)

    获取域名对应的IP地址

    经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的。它能够获取域名对应的IP地址并且返回一个hostent类型的结果。其中包含了IP地址信息,他的头文件为netdb.h

    struct hostent {
    	char *h_name;				// 主机名
    	char **h_aliases;		// 别名列表
    	int h_addrtype;			// 地址类型
    	int h_length;				// 地址的长度
    	char **h_addr_list;		// 地址列表
    }
    

    其中的h_addr_list便是存放IP地址的信息。

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<sys/socket.h>
    #include<arpa/inet.h>
    #include<sys/types.h>
    #include<netdb.h>
    
    int main() {
    	char *hostName = "www.baidu.com";
    	char ip[100];
    	struct hostent *host;
    	struct in_addr **addr_list;
    	int i;
    	
    	if (NULL == (host = gethostbyname(hostName))) {
    		perror("get host by name error");
    		exit(1);
    	}
    	
    	addr_list = (struct in_addr **)host->h_addr_list;
    	for (i = 0; addr_list[i] != NULL; i++) {
    		// inet_ntoa()将long类型的IP地址转化为圆点的字符串形式,作用与inet_addr()相反
    		strcpy(ip, inet_ntoa(*addr_list[i]));
    	}
    	
    	printf("%s resolved to: %s", hostName, ip);
    	return 0;
    }
    

    gethostbyname()用来获取域名对应的IP地址。可以参加gethostbyname()来查看更过的用法。

    从socket连接中获取对方IP

    由前面能够知道accept()返回的是结构体sockaddr_in,由此很容易得知对方的IP和端口信息。

    char *client_ip = inet_ntoa(client.sin_addr);
    int client_port = ntohs(client.sin_port);
    

    到现在为止,我们已经接触了多个重要的类型。

    1. sockaddr_in 连接信息。用在connect send recv等中。
    2. in_addr long类型的IP地址。
    3. sockaddrsockaddr_in类似,是通用的socket连接信息。
    4. hostent 域名对应的IP信息。用在gethostbyname
  • 相关阅读:
    poj 1417 True Liars(并查集+背包dp)
    CodeForces 760 C. Pavel and barbecue(dfs+思维)
    poj 2912 Rochambeau(枚举+带权并查集)
    lightoj 1245 Harmonic Number (II)(简单数论)
    thinkphp __PUBLIC__的定义 __ROOT__等常量的定义
    HTML5 画布参考
    HTML5 DTD
    HTML5 音频视频
    HTML5 事件
    HTML5 标准属性 NEW:HTML 5 中新的标准属性。 注释:HTML 4.01 不再支持 accesskey 属性:
  • 原文地址:https://www.cnblogs.com/tingyugetc/p/6255623.html
Copyright © 2011-2022 走看看