配合http服务器(http://blog.csdn.net/hit_fantasy/article/details/17961539)使用的简单客户端:
#include "unp.h"
void apply(int sockfd,const char *ip,const char* fileName);
int dealurl(const char * url,char *ip,char *fileName);
int myreadline(int fd, char *buf, int n);
int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in servaddr;
char url[100];
char ip[20];
char fileName[50];
printf("http://");
while(scanf(" %s",url))
{
if(dealurl(url,ip,fileName)<0)
{
printf("wrong domin name!\n");
continue;
}
sockfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(80);
Inet_pton(AF_INET, ip, &servaddr.sin_addr);
Connect(sockfd, (SA *) &servaddr, sizeof(servaddr));
//向server发申请
apply(sockfd, ip, fileName);
Close(sockfd);
printf("\nhttp://");
}
exit(0);
}
void apply(int sockfd,const char *ip,const char* fileName)
{
char sendline[MAXLINE];
char receiveline[MAXLINE];
long int fileLength=0;
int n;
char judge[100];
sprintf(sendline,"GET /%s HTTP/1.1\r\nHost: %s\r\n\r\n",fileName,ip);
Writen(sockfd, sendline, strlen(sendline));
while((n=myreadline(sockfd,receiveline,MAXLINE))>2)
{
sscanf(receiveline,"%s",judge);
printf("%s\n",receiveline);
if(!strcmp(judge,"Content-Length:"))
sscanf(receiveline,"%*s%ld",&fileLength);
}
//接着读fileLength长度的文件
while(1)
{
int fs=open(fileName,O_CREAT|O_APPEND|O_RDWR,0777);
if(MAXLINE<fileLength)
{
fileLength-=read(sockfd, receiveline, MAXLINE);;
write(fs,receiveline,MAXLINE);
}
else
{
read(sockfd, receiveline, fileLength);
write(fs,receiveline,fileLength);
close(fs);
break;
}
}
//fflush(stdout);
return;
}
//提取IP地址&申请的文件名 格式如下:
//http://127.0.0.1/index.html
int dealurl(const char * url,char *ip,char *fileName)
{
bzero(fileName,50);
bzero(ip,20);
char host[50];
char judge[10];
sscanf(url,"%[^/]",host);
sscanf(host,"%[^.]",judge);
if(!strcmp(judge,"www"))
{
char str[32];
struct hostent *hptr;
if((hptr = gethostbyname(host)) == NULL)
{
printf(" gethostbyname error for host:%s\n", host);
return -1;
}
strcpy(ip,inet_ntop(hptr->h_addrtype, hptr->h_addr, str, sizeof(str)));
}
else
strcpy(ip,host);
sscanf(url,"%*[^/]%*[/]%s",fileName);
if(!strlen(fileName))
strcpy(fileName,"index.html");
return 0;
}
int myreadline(int fd, char *buf, int n)
{
char ch;
char *base=buf;
while(1)
{
if(read(fd, &ch, 1)!=1)
{
if(errno==EINTR) continue;
return -1;
}
if((*(buf++)=ch)=='\n') break;
}
*buf='\0';
return buf-base;
}