#include #include #include #include #include #include #include #include #include #include #include #include "http_get.h" /* >0 the number of bytes returned ... -1 can not resolve -2 can not create socket -3 can not set non blocking mode -4 connection timeout -5 conection refused */ int httpd_get(char *ip, char *dir, char *file, int tout_conn, int tout_recv, char *ret, size_t size) { int s,err; struct hostent *hp; struct sockaddr_in address; fd_set wset,rset; struct timeval tv; char get[1024],buff[256]; time_t start; unsigned long bts=0; // char *c; tv.tv_sec = tout_conn; tv.tv_usec = 0; memset(ret,0,size); hp=gethostbyname(ip); if (hp==NULL) return(-1); memset(&address,0,sizeof(address)); memcpy(&(address.sin_addr),hp->h_addr,hp->h_length); address.sin_port=htons(80); address.sin_family=AF_INET; s=socket(AF_INET,SOCK_STREAM,0); if (s==-1) return(-2); if ((fcntl(s,F_SETFL,O_NONBLOCK))==-1) {close(s);return (-3);} FD_ZERO(&wset); FD_SET(s,&wset); err=connect(s,(struct sockaddr *)&address,sizeof(address)); err=select(s+1,NULL,&wset,NULL,&tv); if (FD_ISSET(s,&wset)) { if (dir==NULL) strcpy(dir,""); if (file==NULL) strcpy(file,""); sprintf(get,"GET %s%s HTTP/1.1\r\nAccept: */*\r\nAccept-Language: en-us\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)\r\nHost: %s\r\nConnection: Close\r\n\r\n",dir,file,ip); err=send(s,get,strlen(get),MSG_DONTWAIT); if (err==-1) {close(s);return(-5);} //printf("%s\n",get); } else {close(s);return(-4);} tv.tv_sec = 0; tv.tv_usec = 100; start=time(0); while(time(0)<=(start+tout_recv)) { FD_ZERO(&rset); FD_SET(s,&rset); tv.tv_sec = 0; tv.tv_usec = 100; select(s+1,&rset,NULL,NULL,&tv); if (FD_ISSET(s,&rset)) { memset(buff,0,sizeof(buff)); err=recv(s,buff,sizeof(buff)-1,MSG_DONTWAIT); //printf("%s",buff); //printf("%d ",err); if (err==0) return (bts); else { memcpy(ret+bts,buff,err); /* if(strstr(ret,"HTTP/1.1")) { c=strchr(ret,'\n'); if(c!=NULL) *c='\0'; c=strchr(ret,'\r'); if(c!=NULL) *c='\0'; //printf("%s\n",ret); close(s); return(1); }*/ bts+=err; if(bts>=size) { close(s); return -1; } } } } //shutdown(s,SHUT_RDWR); close(s); return 0; }