//Author: Xukai Zou, //used for students' programming assignment in network course. //gcc -lsocket -lnsl http_client.c //a.out www.cs.iupui.edu /index.html #include #include #include #include #include /*#include #include #include #include #include */ int read_data(int s, /* connected socket */ char *buf, /* pointer to the buffer */ int n /* number of characters (bytes) we want */ ) { int bcount; /* counts bytes read */ int br; /* bytes read this pass */ bcount= 0; br= 0; while (bcount < n) { /* loop until full buffer */ if ((br= read(s,buf,n-bcount)) > 0) { bcount += br; /* increment byte counter */ buf += br; /* move buffer ptr for next read */ } else if (br < 0) /* signal an error to the caller */ return(-1); } return(bcount); } int main(int argc, char *argv[]) { struct sockaddr_in servAddr; char receiveBuffer[5000],req[200]; int sockID; struct hostent *hostp; if(argc!=3){ printf("Usage: %s host-name file_path_name\n",argv[0]); return (1); } //open the socket if((sockID=socket(AF_INET,SOCK_STREAM,0))<0) { printf("Error to open socket!!"); return (0); } //set the server structure bzero((char *)&servAddr,sizeof(servAddr)); if((hostp=gethostbyname(argv[1]))==0){ //get host IP by host name printf("host %s not found!\n",argv[1]); return 1; } //the IP address is in hostP, copy to servAddr servAddr.sin_family=AF_INET; servAddr.sin_port=htons(80); //http port //bcopy(&servAddr.sin_addr.s_addr,hostp->sin_addr,sizeof(hostp->length)); memcpy((void *)&servAddr.sin_addr,hostp->h_addr,hostp->h_length); //connect the host printf("Connectionning !!\n"); if(connect(sockID,(struct sockaddr *)&servAddr,sizeof(servAddr))<0) { printf("Fail to connect to host %s\n",argv[1]); return 1; } printf("Connection successful!!\n"); //transfer data //form the request string sprintf(req,"GET %s \r\n",argv[2]); printf("Sending the request=%s \n",req); write(sockID,req,sizeof(req)); //send request //read 1000 chars, can modify to read entire content printf("Reading the data \n"); read_data(sockID,receiveBuffer,1000); printf("%s",receiveBuffer); }