最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
LinuxC/C++學(xué)習(xí)筆記(八):實(shí)現(xiàn)http客戶端請(qǐng)求-創(chuàng)新互聯(lián)

本文參考Linux C/C++ 開(kāi)發(fā)(學(xué)習(xí)筆記十 ):實(shí)現(xiàn)http請(qǐng)求器(TCP客戶端)_菊頭蝙蝠的博客-博客_linux c++ http客戶端

超過(guò)十余年行業(yè)經(jīng)驗(yàn),技術(shù)領(lǐng)先,服務(wù)至上的經(jīng)營(yíng)模式,全靠網(wǎng)絡(luò)和口碑獲得客戶,為自己降低成本,也就是為客戶降低成本。到目前業(yè)務(wù)范圍包括了:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),成都網(wǎng)站推廣,成都網(wǎng)站優(yōu)化,整體網(wǎng)絡(luò)托管,成都微信小程序,微信開(kāi)發(fā),App定制開(kāi)發(fā),同時(shí)也可以讓客戶的網(wǎng)站和網(wǎng)絡(luò)營(yíng)銷和我們一樣獲得訂單和生意!一、需要實(shí)現(xiàn)的內(nèi)容

客戶端請(qǐng)求消息 客戶端發(fā)送一個(gè) HTTP 請(qǐng)求到服務(wù)器的請(qǐng)求消息包括以下格式:請(qǐng)求行( request line )、請(qǐng)求 頭部( header )、空行和請(qǐng)求數(shù)據(jù)四個(gè)部分組成,下圖給出了請(qǐng)求報(bào)文的一般格式。 服務(wù)器響應(yīng)消息 HTTP 響應(yīng)也由四個(gè)部分組成,分別是:狀態(tài)行、消息報(bào)頭、空行和響應(yīng)正文。 下面實(shí)例是一點(diǎn)典型的使用 GET 來(lái)傳遞數(shù)據(jù)的實(shí)例: 客戶端請(qǐng)求:
GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi

服務(wù)端響應(yīng):

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
二、全部代碼
#include#include#include#include#include#include
#include#include#include#define HTTP_VERSION "HTTP/1.1"
#define CONNECTION_TYPE "Connection:close\r\n"
#define BUFFER_SIZE 4096

char* host_to_ip(const char* hostname){
    struct hostent *host_entry=gethostbyname(hostname);
    //14.215.177.39 -->usigned int(因?yàn)閕pv4是32位的,每個(gè)點(diǎn)分隔,值為0~255.正好可以用unsigned int表示,每8位表示一個(gè)0~255,共4個(gè))
    //inet_nota 是把 0x12121212 --->"18.18.18.18" 也就是將網(wǎng)絡(luò)地址轉(zhuǎn)換成“.”點(diǎn)隔的字符串格式
    if(host_entry){
        return inet_ntoa(*(struct in_addr*)*host_entry->h_addr_list);//由于h_addr_list可能有幾個(gè)ip地址,這邊取第一個(gè),因此加*,然后強(qiáng)轉(zhuǎn)成in_addr*,由于inet_ntoa為值傳遞,因此還要加*
    }
    return NULL;
}

int http_create_socket(char* ip){
    int sockfd=socket(AF_INET,SOCK_STREAM,0);//sockfd的結(jié)果就是int類型,是一個(gè)文件句柄。TCP要用SOCK_STREAM,UDP用SOCK_DGRAM
    struct sockaddr_in sin={0};
    sin.sin_family=AF_INET;
    sin.sin_port=htons(80);//http協(xié)議端口為80
    sin.sin_addr.s_addr=inet_addr(ip);//"字符串的ip"地址轉(zhuǎn)為uint32_t和上面的inet_ntoa正好相反

    // int ret=connect(sockfd,(sockaddr*)&sin,sizeof(sockaddr_in));
    // if(ret!=0) return -1;
    if (0 != connect(sockfd, (struct sockaddr*)&sin, sizeof(struct sockaddr_in))) {
        return -1;
    }

    fcntl(sockfd,F_SETFL,O_NONBLOCK);//設(shè)置為非阻塞(如果socket是阻塞,read(),會(huì)阻塞掛起。如果socket是非阻塞,read()也是立刻返回)(設(shè)置文件狀態(tài)標(biāo)志用F_GETFL,讀取文件狀態(tài)標(biāo)志用F_SETFL)
    return sockfd;
}

//hostname:github.com
//resource:/wangbojing
char* http_send_request(const char* hostname,const char* resource){
    char* ip=host_to_ip(hostname);
    int sockfd=http_create_socket(ip);

    char buffer[BUFFER_SIZE]={0};
    sprintf(buffer,
            "GET %s %s\r\n\
Host:%s\r\n\
%s\r\n\
\r\n",
            resource,HTTP_VERSION,
            hostname,
            CONNECTION_TYPE
    );

    send(sockfd,buffer,strlen(buffer),0);


    // recv()//因?yàn)槭欠亲枞麪顟B(tài),如果用recv會(huì)快速過(guò)去

    //select
    fd_set fdread;
    FD_ZERO(&fdread);//用來(lái)清空f(shuō)d_set集合,即讓fd_set集合不再包含任何文件句柄
    FD_SET(sockfd,&fdread);//將sockfd置為檢測(cè)的狀態(tài)(用來(lái)將一個(gè)給定的文件描述符加入集合之中)

    struct timeval tv;
    tv.tv_sec=5;//5秒間隔 select采集一次
    tv.tv_usec=0;


    char* result=(char*)malloc(sizeof(int));
    memset(result,0,sizeof(int));
    while(1){
        int selection=select(sockfd+1,&fdread,NULL,NULL,&tv);//第一個(gè)參數(shù)為所有文件描述符的大值+1   用select去監(jiān)測(cè),這個(gè)io里面有無(wú)數(shù)據(jù)
        if(!selection||!FD_ISSET(sockfd,&fdread)){//FD_ISSET判斷描述符fd是否在給定的描述符集fdset中
            break;
        }else{
            memset(buffer,0,BUFFER_SIZE);
            int len=recv(sockfd,buffer,BUFFER_SIZE,0);//接受數(shù)據(jù),放入buffer中
            if(len==0){//disconnect
                break;
            }
            result=(char*)realloc(result,(strlen(result)+len+1)*sizeof(char));//重新分配內(nèi)存重建(+1是為了末尾'\0',不是最后一個(gè)的話會(huì)被覆蓋)
            strncat(result,buffer,len);//把buffer數(shù)據(jù)copy到resulut中
        }
    }
    return result;

}

int main(int argc,char* argv[]){
    if(argc<3) return -1;
    char* response = http_send_request(argv[1],argv[2]);
    printf("response:%s\n",response);
    free(response);
}
結(jié)果

請(qǐng)求的是百度的首頁(yè),所以只用了個(gè)斜杠

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


當(dāng)前名稱:LinuxC/C++學(xué)習(xí)筆記(八):實(shí)現(xiàn)http客戶端請(qǐng)求-創(chuàng)新互聯(lián)
地址分享:http://fisionsoft.com.cn/article/ijcss.html