linux C获取公网IP

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <netdb.h>
#include <stddef.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>


#define BUF_SIZE   512
char publicIP[30];             //存储公网IP


//获得公网IP
bool getPublicIP(char *url)
{
    struct sockaddr_in pin;
    struct hostent *nlp_host;
    int sd = 0;
    int len = 0;
    char buf[BUF_SIZE] = { 0 };
    char myurl[100] = {0};
    char host[100] = { 0 };
    char GET[100] =  {0};
    char header[240] =  {0};
    char *pHost = 0;


    ///get the host name and the relative address from url name!!!
    strcpy(myurl, url);
    for (pHost = myurl; *pHost != '/' && *pHost != '\0'; ++pHost) ;
    if ((unsigned int)(pHost - myurl) == strlen(myurl))
        strcpy(GET, "/");
    else
        strcpy(GET, pHost);
    *pHost = '\0';
    strcpy(host, myurl);


    ///setting socket param
    if ((nlp_host = gethostbyname(host)) == 0)
    {
        perror("error get host\n");
        return false;
    }


    bzero(&pin, sizeof(pin));
    pin.sin_family = AF_INET;
    pin.sin_addr.s_addr = htonl(INADDR_ANY);
    pin.sin_addr.s_addr = ((struct in_addr *)(nlp_host->h_addr))->s_addr;
    pin.sin_port = htons(80);


    if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("Error opening socket!!!\n");
        return false;
    }


    ///together the request info that will be sent to web server
    ///Note: the blank and enter key byte is necessary,please remember!!!
    strcat(header, "GET");
    strcat(header, " ");
    strcat(header, GET);
    strcat(header, " ");
    strcat(header, "HTTP/1.1\r\n");
    strcat(header, "HOST:");
    strcat(header, host);
    strcat(header, "\r\n");
    strcat(header, "ACCEPT:*/*");
    strcat(header, "\r\nConnection: close\r\n\r\n\r\n");


    ///connect to the webserver,send the header,and receive the web sourcecode
//    if (::connect(sd, (void *)&pin, sizeof(pin)) == -1)
    if (::connect(sd, (sockaddr *)&pin, sizeof(pin)) == -1)
    {
        ::close(sd);
        printf("error connect to socket\n");
        return false;
    }




    if (send(sd, header, strlen(header), 0) == -1)
    {
        ::close(sd);
        perror("error in send \n");
        return false;
    }


    ///send the message and wait the response!!!
    len = recv(sd, buf, BUF_SIZE, 0);
    if (len < 0)
    {
        ::close(sd);
        printf("receive data error!!!\n");
        return false;
    }
    else
    {
        memset(publicIP,0,sizeof(publicIP));
//buf中存储的数据并不只是公网IP,还有其它数据,需要将公网IP解析出来
//不同的环境中,数据格式可能不同,具体情况具体分析
        sscanf(strstr(buf,"utf-8")+9,"%*[^\n]\n%[^\n]",publicIP);
        printf("ip = %s\n",publicIP);


        ::close(sd);
        return true;
    }
}


int main(int argc, char *argv[])
{
    char url[] = "www.3322.org/dyndns/getip";
if(getPublicIP(url))
{
printf("get public IP.\n");
}
else
{
printf("fail to get public IP.\n");
}


return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值