Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > » 正文

Linux网络编程:获取本机的公网IP

来源: sg131971 分享至:
#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

int port = 80;

void getip(char *url)
{
    struct sockaddr_in pin;
    struct hostent *nlp_host;
    int sd = 0;
    int len = 0;
    int i, count = 0;
    int recv_start = 0, recv_end = 0;
    char buf[BUF_SIZE] = { 0 }, myurl[100] =
    {
    0};
    char host[100] = { 0 }, GET[100] =
    {
    0}, 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 ((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");
        exit(1);
    }

    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(port);

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

    ///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)
        printf("error connect to socket\n");

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

    ///send the message and wait the response!!!
    len = recv(sd, buf, BUF_SIZE, 0);
    if (len < 0)
        printf("receive data error!!!\n");
    else
    {
        printf("%s", &(buf[157]));
    }
    close(sd);

}

int main()
{
    char *url = "www.3322.org/dyndns/getip";
    getip(url);
    return 0;
}

运行结果:

[root@ShiGuang test]#
[root@ShiGuang test]# gcc getIP.c -o getIP
[root@ShiGuang test]# ./getIP 
218.13.34.138
[root@ShiGuang test]# 




Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史