#include #include #include #include #include void error(char *msg) { perror(msg); exit(0); } int main(int argc, char *argv[]) { int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent *server; char buffer[2560]; char header_buff[2560]; if (argc < 3) { fprintf(stderr,"usage %s url port\n", argv[0]); exit(0); } char *fname, *hostname, *getstr ; int i, hnp; i=hnp=0; for (i=0; i0;i--) { if ( ((*(argv[1]+i))=='/') ) { hnp=i; break; } } fname=malloc(strlen(argv[1])-hnp); strncpy(fname,argv[1]+hnp+1,strlen(argv[1])-hnp); printf("%s\n",fname); portno = atoi(argv[2]); sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) error("ERROR opening socket"); server = gethostbyname(hostname); if (server == NULL) { fprintf(stderr,"ERROR, no such host\n"); exit(0); } bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); serv_addr.sin_port = htons(portno); if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) error("ERROR connecting"); bzero(buffer,sizeof(buffer)); strcpy(buffer,"GET "); strcpy(buffer+strlen(buffer),getstr); strcpy(buffer+strlen(buffer)," HTTP/1.0\r\n\r\n"); printf("%s",buffer); n = write(sockfd,buffer,strlen(buffer)); FILE *file; file = fopen(fname, "wb"); if (n < 0) error("ERROR writing to socket"); bzero(buffer,sizeof(buffer)); bzero(header_buff,sizeof(header_buff)); int nb,o,hp,c; o=nb=hp=c=0; /*locating header*/ while ( (hp==0) && (nb=read(sockfd,buffer+o,sizeof(buffer)-o)) ) { printf("%d bytes recieved \n",nb); o=o+nb; for (c=0; c<=o-3; c++) { if ( ((*(buffer+c))=='\r') && ((*(buffer+c+1))=='\n') && ((*(buffer+c+2))=='\r') && ((*(buffer+c+3))=='\n') ) { //printf("header\n%sbuffer\n%d bytes header\n",buffer,c); hp=c; break; } } printf("%d bytes of header and data \n",o); } /*copy header into header buff*/ strncpy(header_buff,buffer,hp); printf("begin header\n%s\nend header\n",header_buff); /*write remind afrer header an \r\n\r\n as data */ fwrite((buffer+hp+4),1,(o-hp-4),file); bzero(buffer,sizeof(buffer)); while ( (nb=read(sockfd,buffer,sizeof(buffer))) ) { printf("%d bytes of data recieved \n",nb); //printf("%s",buffer); fwrite(buffer,1,nb,file); bzero(buffer,sizeof(buffer)); } fclose(file); return 0; }