簡単な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;
}