weixin_43697323 2019-06-21 21:44 采纳率: 0%
浏览 1016

C语言用IP地址通过socket获取网页内容(或者源代码)

图片说明
百度有通过域名获取的,但是没有通过ip获取啊
求大神啊!!!!!!!!!!!!!!!!!!!!!!!!!!!

  • 写回答

1条回答 默认 最新

  • 小白根雕 2019-06-22 10:59
    关注

    #include
    #include
    #include
    #pragma comment(lib, "ws2_32.lib")

    void geturl(char *url)
    {
    WSADATA WSAData={0};
    SOCKET sockfd;
    struct sockaddr_in addr;
    struct hostent *pURL;
    char myurl[BUFSIZ];
    char *pHost = 0, *pGET = 0;
    char host[BUFSIZ], GET[BUFSIZ];
    char header[BUFSIZ] = "";
    static char text[BUFSIZ];
    int i;

    /*
    *        windows下使用socket必须用WSAStartup初始化,否则不能调用
    */
    if(WSAStartup(MAKEWORD(2,2), &WSAData))
    {
        printf("WSA failed/n");
        return;
    }
    
    /*
    *        分离url中的主机地址和相对路径
    */
    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);
    printf("%s/n%s/n", host, GET);
    
    /*
    *        设定socket参数,并未真正初始化
    */
    sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    pURL = gethostbyname(host);
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = *((unsigned long*)pURL->h_addr);
    addr.sin_port = htons(80);
    
    /*
    *        组织发送到web服务器的信息
    *        为何要发送下面的信息请参考HTTP协议的约定
    */
    strcat(header, "GET ");
    strcat(header, GET);
    strcat(header, " HTTP/1.1/r/n");
    strcat(header, "HOST: ");
    strcat(header, host);
    strcat(header, "/r/nConnection: Close/r/n/r/n");
    
    /*
    *        连接到服务器,发送请求header,并接受反馈(即网页源代码)
    */
    connect(sockfd,(SOCKADDR *)&addr,sizeof(addr));
    
    send(sockfd, header, strlen(header), 0);
    
    while ( recv(sockfd, text, BUFSIZ, 0) > 0)
    {       
        printf("%s", text);
        strnset(text, '/0', BUFSIZ);
    }
    
    closesocket(sockfd);
    
    WSACleanup();
    

    }

    int main()
    {
    char url[256];
    printf("http://");
    scanf("%s", url);
    geturl(url);
    return 0;
    }

    评论

报告相同问题?

悬赏问题

  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥15 Stata 面板数据模型选择
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏