#include "http_lib.h" //----------------------------------------------------------------- // URLの分析: URLから[ホスト名],[ファイル名],[ポート番号]の取得 //----------------------------------------------------------------- int split_url(char* url,char*host,char* path,unsigned short* port) { char *p,host_path[URL_LEN]; if(strlen(url)>URL_LEN-1){ fprintf(stderr,"URLが長すぎます.\n"); return 1; } //-------------------------------------------------- // http:// から始まる文字列で,その後に文字列が続く //-------------------------------------------------- if(strstr(url,"http://") && sscanf(url,"http://%s",host_path)){ // ホスト名の取得 if((p = strchr(host_path,'/')) != NULL){ strcpy(path,p); *p = '\0'; strcpy(host,host_path); } else { strcpy(host,host_path); } // ポート番号の取得 if((p = strchr(host,':')) != NULL){ *port = atoi(p+1); *p = '\0'; } if(*port <= 0) *port = 80; } else { fprintf(stderr,"URLは [http://host/path] の形式で指定してください.\n"); return 1; } return 0; } //----------------------------------------------------------------- // HTTP サーバへの接続 //----------------------------------------------------------------- int http_open(char* host,int port) { int s; struct hostent *servhost; struct sockaddr_in server; struct servent *service; // ホストの情報を取得 servhost = gethostbyname(host); if(servhost == NULL){ perror(host); return -1; } // IPアドレスを示す構造体をコピー bzero((char*)&server,sizeof(server)); server.sin_family = AF_INET; bcopy(servhost->h_addr,(char*)&server.sin_addr,servhost->h_length); // ポート番号の設定 if(port != 0){ server.sin_port = htons(port); } else { service = getservbyname("http", "tcp"); if(service != NULL) server.sin_port = service->s_port; else server.sin_port = htons(80); } // ソケット生成 if((s = socket(AF_INET,SOCK_STREAM,0)) < 0){ perror("socket"); return -1; } // サーバに接続 if(connect(s,(struct sockaddr *)&server,sizeof(server)) == -1){ perror("connect"); return -1; } return s; } //----------------------------------------------------------------- // HTTP サーバへ受信要求 //----------------------------------------------------------------- void http_request(int s,char* host,char* path,int port) { char send_buf[URL_LEN]; // HTTP プロトコル生成 & サーバに送信 sprintf(send_buf,"GET %s HTTP/1.0\r\n",path); write(s,send_buf,strlen(send_buf)); sprintf(send_buf,"Host: %s:%d\r\n",host,port); write(s,send_buf,strlen(send_buf)); sprintf(send_buf,"\r\n"); write(s,send_buf,strlen(send_buf)); }