質問編集履歴

2 追記

strike1217

strike1217 score 564

2017/01/27 14:25  投稿

ソケットでHEAD情報を取得する
```C
   unsigned char buffer[4096];
   const unsigned char *buf = "HEAD / HTTP/1.0\r\n\r\n";
      if(sockfd = socket(PF_INET, SOCK_STREAM, 0) == -1)
           printf("Error! to make socket\n");
       addr.sin_family = AF_INET;
       addr.sin_port = htons(80);
       addr.sin_addr = *((struct in_addr *)host_info -> h_addr);
       memset(&(addr.sin_zero), '\0', 8);
       connect(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr));
       int lone = write(sockfd, buf, strlen(buf));
       printf("sent letters %d Bytes\n", lone);
       
       if(lone != -1){
           while(read(sockfd, buffer, 1024)){
               if(strcmp(buffer, "Server:") == 0){
                   printf("%s was resieved from %s\n", buffer, argv[1]);
                   exit(0);
               }
           }   
       }
       else
           printf("failed to send letters\n");
```
プログラムは少し省略しています。
文字列の送信は出来るのですが、受信が出来ません。
telnet www.internic.net 80
HEAD / HTTP/1.0
Server: Apache ← この子だけを取得したいです!!
send関数を使用すると送信も失敗します。
send関数は使わない方がよいのでしょうか??
分かる方教えてください。
分かる方教えてください。
[追記]
strcmp()の方は以下のように新たな関数を作成したら、できました。
```C
int recv_line(int sockfd, unsigned char *dest_buffer) {
#define EOL "\r\n"
#define EOL_SIZE 2
  unsigned char *ptr;
  int eol_matched = 0;
  ptr = dest_buffer;
  while(recv(sockfd, ptr, 1, 0) == 1) { // 1バイトを読み込む。
     if(*ptr == EOL[eol_matched]) {
        eol_matched++;
        if(eol_matched == EOL_SIZE) {
           *(ptr+1-EOL_SIZE) = '\0';
           return strlen(dest_buffer);
        }
     } else {
        eol_matched = 0;
     }
     ptr++;
  }
  return 0;
}
```
  • C++

    4552 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    4682 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1 追記

strike1217

strike1217 score 564

2017/01/27 12:18  投稿

ソケットでHEAD情報を取得する
```C
   unsigned char buffer[4096];
   const unsigned char *buf = "HEAD / HTTP/1.0\r\n\r\n";
      if(sockfd = socket(PF_INET, SOCK_STREAM, 0) == -1)
           printf("Error! to make socket\n");
       addr.sin_family = AF_INET;
       addr.sin_port = htons(80);
       addr.sin_addr = *((struct in_addr *)host_info -> h_addr);
       memset(&(addr.sin_zero), '\0', 8);
       connect(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr));
       int lone = write(sockfd, buf, strlen(buf));
       printf("sent letters %d Bytes\n", lone);
       
       if(lone != -1){
           while(read(sockfd, buffer, 1024)){
               if(strcmp(buffer, "Server:") == 0){
                   printf("%s was resieved from %s\n", buffer, argv[1]);
                   exit(0);
               }
           }   
       }
       else
           printf("failed to send letters\n");
```
プログラムは少し省略しています。
文字列の送信は出来るのですが、受信が出来ません。
telnet www.internic.net 80
HEAD / HTTP1.0
HEAD / HTTP/1.0
Server: Apache ← この子だけを取得したいです!!
send関数を使用すると送信も失敗します。
send関数は使わない方がよいのでしょうか??
分かる方教えてください。
  • C++

    4552 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    4682 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る