如何用linux写pcc程序,简略的linux -c http-client

当前位置:我的异常网» Linux/Unix » 简略的linux -c http-client

简略的linux -c http-client

www.myexceptions.net  网友分享于:2013-10-28  浏览:74次

简单的linux -c http-client

#include

#include

#include

#include

#include

#include "httpclient.h"

#include

#include

#include

#include

const char * http_s = "http://";

typedef struct{

char *url;

int port;

char *host;

char *anyurl;

int isip;

}Hostinfo;

int isip(const char * s){

while( *s ){

if(isalpha(*s) && *s != '.')

{

return 0;

}

s++;

}

return 1;

}

int gethostinfobyurl(const char * url, char ** host, int *port, char ** anyurl)

{

if(url == NULL || 0!=strncmp(url, http_s, strlen(http_s)) ){

printf("url is not legal, %s\n", url);

return -1;

}

char * h_url = strstr(url,"//");

h_url = h_url + 2;

*anyurl= strchr(h_url,'/');

printf("hurl: %s\n",h_url);

if(anyurl != NULL){

char cc[1024];

char *pcc = cc;

strcpy(cc,h_url);

h_url = strsep(&pcc,"/");

printf("hhurl:%s\n",h_url);

}

if(NULL !=strchr(h_url,':')){

*host = strsep(&h_url,":");

char *cport = strsep(&h_url,":");

*port = atoi(cport);

}

else{

*host = h_url;

}

return 0;

}

void datas(int fp,Hostinfo *hinfo){

char request[1024];

bzero(&request,1024);

//sprintf(request,"GET %s  HTTP/1.1\r\nHost:  61.135.169.125:80\r\nConnection:   Close\r\n\r\n","/");

sprintf(request,   "GET   %s   HTTP/1.1\r\nAccept:   */*\r\nAccept-Language:   zh-cn\r\n\

Host:  %s:%d\r\nConnection:   Close\r\n\r\n ", hinfo->anyurl,hinfo->host,hinfo->port);

printf("\n\n");

printf("%s",request);

printf("\n\n");

printf("request is %s\n", request);

int send = write(fp, request,strlen(request));

if(send == -1){

printf("send error\n");

exit(1);

}

printf("send num: %d\n", send);

int BUFFER_SIZE = 2048;

char buffer[BUFFER_SIZE];

int length;

bzero(&buffer, BUFFER_SIZE);

length = read(fp,buffer,BUFFER_SIZE);

char * content = buffer;

if(length <=0){

printf("error! read http return content!");

//return NULL;

}

char * head = strsep(&content,"\r\n");

printf("head:%s\n",head);

strsep(&head," ");

printf("1-->>head:%s\n",head);

if(head == NULL){

printf("error! read http return content!");

return;

}

head = strsep(&head," ");

printf("2-->>head:%s\n",head);

int result = atoi(head);

if(result == 200){

printf("success\n");

}

/*while( length = read(fp,buffer,BUFFER_SIZE)){

if(length <=0){

return ;

}

bzero(&buffer,1024);

}

*/

}

int connect_http(Hostinfo * hinfo)

{

int cfd;

struct sockaddr_in s_add;

struct sockaddr_in * sinp;

struct addrinfo hint;

struct addrinfo *ailist, *aip;

int i = 0, err;

char seraddr[128];

printf(" hinfo->host: %s\n", hinfo->host);

if(!(hinfo -> isip)){

hint.ai_family = AF_INET;

hint.ai_socktype = SOCK_STREAM;

hint.ai_flags = AI_CANONNAME;

hint.ai_protocol = 0;

hint.ai_addrlen = 0;

hint.ai_addr = NULL;

hint.ai_canonname = NULL;

hint.ai_next = NULL;

char name[1024];

strcpy(name, hinfo->host);

if ((err = getaddrinfo(name, NULL, &hint, &ailist)) != 0) {

printf("getaddrinfo error: %s host :%s\n", gai_strerror(err), hinfo->host);

exit(-1);

}

for (aip = ailist; i==0 && aip != NULL; aip = aip->ai_next) {

sinp = (struct sockaddr_in *)aip->ai_addr;

//break;

i = i+1;

if (inet_ntop(sinp->sin_family, &sinp->sin_addr, seraddr, INET_ADDRSTRLEN) != NULL)

{

printf("\nserver address is %s\n", seraddr);

}

}

}

else{

strcpy(seraddr,hinfo->host);

}

cfd = socket(AF_INET,SOCK_STREAM,0);

if(cfd == -1){

printf("socket error\n");

return -1;

}

struct timeval timeo = {3, 0};

socklen_t len = sizeof(timeo);

setsockopt(cfd, SOL_SOCKET, SO_SNDTIMEO, &timeo, len);

bzero(&s_add, sizeof(struct sockaddr_in));

s_add.sin_family=AF_INET;

s_add.sin_addr.s_addr= inet_addr(seraddr);

s_add.sin_port=htons(hinfo->port);

if(-1 == connect(cfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))

{

printf("connect fail !\r\n");

return -1;

}

// int flags = fcntl(cfd, F_GETFL, 0);                       //设置异步

//fcntl(cfd, F_SETFL, flags | O_NONBLOCK);

printf("connect ok !\r\n");

datas(cfd,hinfo);

close(cfd);

return 1;

}

char *  get(const char * url)

{

char * host = (char *)malloc(200);

char * curl = (char *)malloc(200);

int port = 80;

int *cport = &port;

int result = gethostinfobyurl(url,&host,cport,&curl);

if(result < 0){

return NULL;

}

printf("parase host:%s\n",host);

Hostinfo *hinfo = (Hostinfo*)calloc(1,sizeof(Hostinfo));

hinfo->port = port;

hinfo->host = host;

hinfo->anyurl = curl;

hinfo->isip = isip(hinfo->host);

connect_http(hinfo);

return NULL;

}

int main()

{

const char * url = "http://61.135.169.105:80/";

/*char * host = (char *)malloc(200);

char * curl = (char *)malloc(200);

int port = 80;

int *cport = &port;

gethostinfobyurl(url,&host,cport,&curl);

printf("host:%s \t address: %s\n",host,curl);

printf("port : %d\n",port);

*/

get(url);

return 0;

}

文章评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值