|
/* 客户程序开始建立 sockfd描述符 */ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)/*建立SOCKET连接*/ { 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))==-1)/*连接网站*/ { fprintf(stderr,"Connect Error:%s/a/n",strerror(errno)); exit(1); } sprintf(request, "GET /%s HTTP/1.1/r/nAccept: */*/r/nAccept-Language: zh-cn/r/n/ User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)/r/n/ Host: %s:%d/r/nConnection: Close/r/n/r/n", host_file, host_addr, portnumber); printf("%s", request);/*准备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); /*发送http请求request*/ send = 0;totalsend = 0; nbytes=strlen(request); while(totalsend < nbytes) { send = write(sockfd, request + totalsend, nbytes - totalsend); if(send==-1) {printf("send error!%s/n", strerror(errno));exit(0);} totalsend+=send; printf("%d bytes send OK!/n", totalsend); } fp = fopen(local_file, "a"); if(!fp) { printf("create file error! %s/n", strerror(errno)); return 0; } printf("/nThe following is the response header:/n"); i=0; /* 连接成功了,接收http响应,response */ while((nbytes=read(sockfd,buffer,1))==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);/*每1K时存盘一次*/ } } fclose(fp); /* 结束通讯 */ close(sockfd); exit(0); }
|