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
优质内容筛选与推荐>>
1、美法官批准微软请求 关闭277个恶意网站
2、看这个算式: ☆☆☆ + ☆☆☆ = ☆☆☆
3、Linq to Visual Tree-可视化树的类Linq查询扩展API(译)
4、CSS的animation属性使用实例分析------------一、animation的语法
5、软工第三次作业:原型设计


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号