簡単なHTTPクライアント(ブラウザ)
使用例 ./http-client www.yahoo.co.jp 80 /index.html
#define BUF_LEN 1024 /* バッファのサイズ */
int main(int argc, char *argv[]){
int fd; /* ソケットのためのファイルディスクリプタ */
int error,l;
struct addrinfo hints, *res, *ai;
char buffer[BUF_LEN];
FILE *fp; /* ファイルポインタ */
if(argc != 4){
fprintf(stderr,"usage:%s <hostname> <portnumber> <path>\n",argv[0]);
exit(1);
} /* 引数チェック */
memset(&hints,0,sizeof(hints)); /* hintsの初期化 */
hints.ai_family = PF_UNSPEC; /* IPv6についても検索 */
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(argv[1],argv[2],&hints,&res);
if(error != 0){
printf("getaddrinfo error:%s,%s\n",argv[1],gai_strerror(error));
exit(1);
} /* エラーチェック */
for(ai=res;ai!=NULL;ai=ai->ai_next){
/* すべてのアドレスファミリについて検索 */
fd = socket(ai->ai_family,ai->ai_socktype,ai->ai_protocol);
/* ソケットを作成 */
if(fd < 0){
fprintf(stderr,"can't create socket\n");
continue;
}
if(connect(fd,ai->ai_addr,ai->ai_addrle\n)==0){
break;
}
fprintf(stderr,"can't connect server\n");
close(fd);
}
if(res!=NULL){
freeaddrinfo(res);
}
if(ai == NULL){
fprintf(stderr,"can't connect to all servers\n");
exit(1);
}
fp = fdopen(fd,"r+"); /* fprintfなどを使えるようにする */
if(fp == NULL){
fprintf(stderr,"fdopen failed\n");
return 1;
}
setvbuf(fp,NULL,_IONBF,0); /* バッファリングOFF */
fprintf(fp,"GET %s HTTP/1.0\r\n",argv[3]);
fprintf(fp,"Host: %s:%s\r\n",argv[1],argv[2]);
fprintf(fp,"\r\n"); /* GETをサーバーに送信 */
while(1){
if(fgets(buffer,sizeof(buffer),fp) == NULL){
break;
}
printf("%s",buffer);
}
fclose(fp);
close(fd);
return 0;
}
使用例 ./http-client www.yahoo.co.jp 80 /index.html
#define BUF_LEN 1024 /* バッファのサイズ */
int main(int argc, char *argv[]){
int fd; /* ソケットのためのファイルディスクリプタ */
int error,l;
struct addrinfo hints, *res, *ai;
char buffer[BUF_LEN];
FILE *fp; /* ファイルポインタ */
if(argc != 4){
fprintf(stderr,"usage:%s <hostname> <portnumber> <path>\n",argv[0]);
exit(1);
} /* 引数チェック */
memset(&hints,0,sizeof(hints)); /* hintsの初期化 */
hints.ai_family = PF_UNSPEC; /* IPv6についても検索 */
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(argv[1],argv[2],&hints,&res);
if(error != 0){
printf("getaddrinfo error:%s,%s\n",argv[1],gai_strerror(error));
exit(1);
} /* エラーチェック */
for(ai=res;ai!=NULL;ai=ai->ai_next){
/* すべてのアドレスファミリについて検索 */
fd = socket(ai->ai_family,ai->ai_socktype,ai->ai_protocol);
/* ソケットを作成 */
if(fd < 0){
fprintf(stderr,"can't create socket\n");
continue;
}
if(connect(fd,ai->ai_addr,ai->ai_addrle\n)==0){
break;
}
fprintf(stderr,"can't connect server\n");
close(fd);
}
if(res!=NULL){
freeaddrinfo(res);
}
if(ai == NULL){
fprintf(stderr,"can't connect to all servers\n");
exit(1);
}
fp = fdopen(fd,"r+"); /* fprintfなどを使えるようにする */
if(fp == NULL){
fprintf(stderr,"fdopen failed\n");
return 1;
}
setvbuf(fp,NULL,_IONBF,0); /* バッファリングOFF */
fprintf(fp,"GET %s HTTP/1.0\r\n",argv[3]);
fprintf(fp,"Host: %s:%s\r\n",argv[1],argv[2]);
fprintf(fp,"\r\n"); /* GETをサーバーに送信 */
while(1){
if(fgets(buffer,sizeof(buffer),fp) == NULL){
break;
}
printf("%s",buffer);
}
fclose(fp);
close(fd);
return 0;
}