/******* http客户端程序 httpclient.c ************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/********************************************
功能:搜索字符串右边起的第一个匹配字符
********************************************/
char * Rstrchr(char *s, char x)
{
int i = 0;
if(s == NULL)
return NULL;
i = strlen(s);
while(s[i-1])
{
if(strchr(s+(i-1),x))
return (s+(i-1));
else
i--;
}
return NULL;
}
/**************************************************************
功能:从字符串src中分析出网站地址和端口,并得到用户要下载的文件
***************************************************************/
void get_host_info(char *src, char *web, char *file, int *port)
{
char *pA;
char *pB;
memset(web, 0, sizeof(web));
memset(file, 0, sizeof(file));
*port = 0;
if(src == NULL)
return;
pA = src;
if(!strncmp(pA, "http://", strlen("http://")))
pA = src+strlen("http://");
else if(!strncmp(pA, "https://", strlen("https://")))
pA = src+strlen("https://");
pB = strchr(pA, '/');
if(pB)
{
memcpy(web, pA, strlen(pA) - strlen(pB));
if(pB+1)
{
memcpy(file, pB + 1, strlen(pB) - 1);
file[strlen(pB) - 1] = 0;
}
}
else
memcpy(web, pA, strlen(pA));
if(pB)
web[strlen(pA) - strlen(pB)] = 0;
else
web[strlen(pA)] = 0;
pA = strchr(web, ':');
if(pA)
*port = atoi(pA + 1);
else
*port = 80;
}
int main(int argc, char **argv)
{
int i = 0;
char * pt;
int sockfd;
int len = 0, totalsend = 0;
int portnumber,nbytes;
FILE * fp = NULL;
struct sockaddr_in server_addr;
struct hostent *host;
char buffer[1024];
char host_addr[256];
char host_file[1024];
char local_file[256];
char request[1024];
if(argc != 2)
{
fprintf(stderr,"Usage:%s web-address\a\n",argv[0]);
exit(1);
}
get_host_info(argv[1], host_addr, host_file, &portnumber);
printf("webhost:%s,hostfile:%s,portnumber:%d\n", host_addr,host_file,portnumber);
if((host = gethostbyname(host_addr)) == NULL)
{
fprintf(stderr,"Gethostname error, %s\n", strerror(errno));
exit(1);
}
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) <= 0)
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portnumber);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
if(connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr)) < 0)
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
exit(1);
}
sprintf(request, "GET /%s HTTP/1.1\r\n Accept-Language: zh-cn\r\n Host: %s:%d\r\n Connection: Close\r\n\r\n", host_file, host_addr, portnumber);
printf("request:%s\n", request);
if(host_file && *host_file)
pt = Rstrchr(host_file, '/');
else
pt = 0;
memset(local_file, 0, sizeof(local_file));
if(pt && *pt)
{
if((pt + 1) && *(pt+1))
strcpy(local_file, pt + 1);
else
memcpy(local_file, host_file, strlen(host_file) - 1);
}
else if(host_file && *host_file)
strcpy(local_file, host_file);
else
strcpy(local_file, "index.html");
printf("local filename to write:%s\n\n", local_file);
nbytes = strlen(request);
while(totalsend < nbytes)
{
if((len = send(sockfd, request+totalsend, nbytes-totalsend, 0)) < 0)
{
printf("send error!%s\n", strerror(errno));
close(sockfd);
exit(0);
}
totalsend += len;
printf("%d bytes send OK!\n", totalsend);
}
fp = fopen(local_file, "a");
if(fp == NULL)
{
printf("create file error! %s\n", strerror(errno));
close(sockfd);
return 0;
}
printf("\nThe following is the response header:\n");
while((nbytes = recv(sockfd, buffer, 1, 0)) == 1)
{
if(i > 4)
{
if(buffer[0] == '\r' || buffer[0] == '\n')
i++;
else
i = 0;
printf("%c", buffer[0]);/*把http头信息打印在屏幕上*/
}
else
{
fwrite(buffer, 1, 1, fp);/*将http主体信息写入文件*/
i++;
if(i%1024 == 0)
fflush(fp);
}
}
fclose(fp);
close(sockfd);
exit(0);
}
阅读(2101) | 评论(0) | 转发(0) |