linux c 获取本机公网IP的实现方法_C 语言

1、linux c代码实现

复制代码 代码如下:

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
typedef enum {false,true}bool;
int main()
{
    bool flag;
    int    sock;
    char **pptr = NULL;
    struct sockaddr_in    destAddr;
    struct hostent    *ptr = NULL;
    char destIP[128];
    char szBuffer[] = {"GET /ip2city.asp HTTP/1.1\r\nHost:www.ip138.com\r\nConnection:Close\r\n\r\n"};
    char res[1024];

  //初始化socket
    sock = socket(AF_INET,SOCK_STREAM,0);
    if( -1 == sock ){
        perror("creat socket failed");
        exit(0);
    }

    bzero((void *)&destAddr,sizeof(destAddr));
    destAddr.sin_family = AF_INET;       
    destAddr.sin_port = htons(80);
   //首先是获取www.ip138.com的IP地址
    ptr = gethostbyname("www.ip138.com");
    if(NULL == ptr){
        perror("gethostbyname error");
        exit(0);
    }  
  //对于www.ip138.com的每个IP进行尝试连接,直到有一个连接成功为止,或者无法连接,则退出程序
    for(flag=false,pptr=ptr->h_addr_list ; NULL != *pptr ; ++pptr){
        inet_ntop(ptr->h_addrtype,*pptr,destIP,sizeof(destIP));
        printf("addr:%s\n",destIP);
        destAddr.sin_addr.s_addr = inet_addr(destIP);
        if(-1!=connect(sock,(struct sockaddr *)&destAddr,sizeof(struct sockaddr))){
            flag = true;
            break;
        }
    }

    if(false == flag){
        perror("connect failed");
    }

  //发送获取IP的数据包给www.ip138.com
    if(strlen(szBuffer) != send(sock,szBuffer,strlen(szBuffer),0)){
        perror("send error");
        exit(0);
    }

  //接收数据包
    if(-1 == recv(sock,res,1024,0)){
        perror("recv error");
        exit(0);
    }

    printf("res:\n%s\n",res);   
    return 0;
}

2、将上述代码保存getip.c,并使用如下命令编译

复制代码 代码如下:

gcc -o getip getip.c

3、运行程序

复制代码 代码如下:

./getip

时间: 2024-10-26 21:05:42

linux c 获取本机公网IP的实现方法_C 语言的相关文章

vc获取计算机名和ip地址的方法_C 语言

本文实例讲述了vc获取计算机名和ip地址的方法.分享给大家供大家参考.具体实现方法如下: #include <winsock2.h> #include <stdio.h> #pragma comment(lib,"ws2_32.lib") void main() { WSADATA wsadata; WORD dwVersionRequested; int err; err=WSAStartup(dwVersionRequested,&wsadata);

.net获取本机公网IP地址示例

 本文主要介绍了.net获取本机公网IP地址的方法,使用了ip138的数据,大家参考使用吧 代码很简单,直接看代码   代码如下: using System; using System.Net; using System.Text.RegularExpressions;   namespace Keleyi.Com {     public class GetInternetIP     {         public static string GetIP()         {      

.net获取本机公网IP地址示例_实用技巧

代码很简单,直接看代码 复制代码 代码如下: using System;using System.Net;using System.Text.RegularExpressions; namespace Keleyi.Com{    public class GetInternetIP    {        public static string GetIP()        {            using (var webClient = new WebClient())       

linux编程获取本机网络相关参数

getifaddrs()和struct ifaddrs的使用,获取本机IP 博客分类:    Linux C编程       ifaddrs结构体定义如下: C代码   struct ifaddrs    {        struct ifaddrs  *ifa_next;    /* Next item in list */        char            *ifa_name;    /* Name of interface */        unsigned int    

php获取本机真实IP地址实例代码_php技巧

本文实例为大家分享了php获取本机真实IP地址实例代码,供大家参考. 主要是获取操作系统为win2000/xp.win7的本机IP真实地址,和获取操作系统为linux类型的本机IP真实地址,具体内容如下 function getLocalIP() { $preg = "/\A((([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\.){3}(([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\Z/

python在windows和linux下获得本机本地ip地址方法小结_python

本文实例总结了python在windows和linux下获得本机本地ip地址方法.分享给大家供大家参考.具体分析如下: python的socket包含了丰富的函数和方法可以获得本机的ip地址信息,socket对象的gethostbyname方法可以根据主机名获得本机ip地址,socket对象的gethostbyname_ex方法可以获得本机所有ip地址列表 第一种方法:通过socket.gethostbyname方法获得 import socket localIP = socket.gethos

Linux 下获取LAN中指定IP的网卡的MAC(物理地址)

// all.h// 2005/06/20,a.m. wenxy #ifndef _ALL_H#define _ALL_H #include <memory.h>#include <stdio.h>#include <stdlib.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/socket.h>#include <net/if.h>#include

用什么方法能让通过路由器联网的终端设备获取到的公网ip是动态的?

问题描述 用什么方法能让通过路由器联网的终端设备获取到的公网ip是动态的? 用什么方法能让通过路由器联网的终端设备获取到的公网ip是动态的?

ip地址-Android手机用一个方法获取本机的IP地址之后

问题描述 Android手机用一个方法获取本机的IP地址之后 上图中的IP地址我知道是IPv6的地址,有两个问题:1.后面那个"%wlan0"啥意思?2.怎么才能获取到IPv4的地址? 解决方案 %wlan0应该是无线局域网 取ipv4可以参考这里http://blog.csdn.net/stormwy/article/details/8832164