2016-09-09 3 views
3

ちょっと私は以下のコードでGoogleからの返信を受け取ろうとしています。 Telnet www.google.com 80 HEAD/HTTP/1.1から受け取るのと同じ種類の返信を受けていますが、それはちょうどぶら下がっています。誰もがここでの問題を見つけることができるなら、私は本当にGREATFULCでソケットサーバーを使用しているHTMLヘッド要求

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 

void error(const char *msg) 
{ 
     perror(msg); 
     exit(0); 
} 

int main(int argc, char *argv[]) 
{ 
     int sockfd, portno, n; 
     struct sockaddr_in serv_addr; 
     struct hostent *server; 

     char buffer[256]; 
     portno = 80; 
     sockfd = socket(AF_INET, SOCK_STREAM, 0); 
     if (sockfd < 0) 
     { 
      error("ERROR opening socket"); 
     } 

     server = gethostbyname("www.google.com.au"); 
     if (server == NULL) 
     { 
      fprintf(stderr,"ERROR, no such host\n"); 
      exit(0); 
     } 

     bzero((char *) &serv_addr, sizeof(serv_addr)); 
     serv_addr.sin_family = AF_INET; 

     bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr,server->h_length); 
     serv_addr.sin_port = htons(portno); 

     if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
     { 
      error("ERROR connecting"); 
     } 
     puts("Retreiving HTML Head"); 

     ssize_t nByte = write(sockfd,"HEAD/HTTP/1.1\r\n",strlen("HEAD/HTTP/1.1\r\n")); 
     if(nByte <= 0) 
     { 
      perror("send"); 
       exit(EXIT_FAILURE); 
     } 

     size_t recived_len = 0; 
     if ((recived_len = read(sockfd,buffer,255)) == 0) 
     { 
       bzero(buffer,256); 
       printf("%s", buffer); 
     } 

     if (recived_len == -1) 
     { 
      perror("read"); 
     } 

     close(sockfd); 
     return 0; 
} 
+0

\ R \ n \ R \ N'(すなわち、CRLFが続く空行) – tkausl

+0

は[HTTP]についてもう少しを読みます( https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol)おそらく仕様([RFC2616](https://tools.ietf.org/html/rfc2616))でも。特にリクエストヘッダが空行でどのように終了するかを調べます。 –

+0

は問題を解決しますが、私はまだread()に何も返されません。HTTPのおかげで、読んでくれます。 –

答えて

0

だろう。ここreadからのHTTPレスポンスを返すいくつかのわずかな変化で、あなたのコードです。

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 

void error(const char *msg) { 
    perror(msg); 
    exit(0); 
} 

int main(int argc, char *argv[]) { 
    int sockfd, portno, n; 
    struct sockaddr_in serv_addr; 
    struct hostent *server; 

    char buffer[256]; 
    portno = 80; 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) { 
     error("ERROR opening socket"); 
    } 

    server = gethostbyname("www.google.com.au"); 
    if (server == NULL) { 
     fprintf(stderr, "ERROR, no such host\n"); 
     exit(0); 
    } 

    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 

    bcopy((char *) server->h_addr, (char *) &serv_addr.sin_addr.s_addr, server->h_length); 
    serv_addr.sin_port = htons(portno); 

    if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { 
     error("ERROR connecting"); 
    } 
    puts("Retreiving HTML Head"); 

    ssize_t nByte = write(sockfd, "HEAD/HTTP/1.1\r\n\r\n", strlen("HEAD/HTTP/1.1\r\n\r\n")); 
    if (nByte <= 0) { 
     perror("send"); 
     exit(EXIT_FAILURE); 
    } 

    size_t recived_len = 0; 
    if ((recived_len = read(sockfd, buffer, 255)) > 0) { 
     //bzero(buffer, 256); 
     printf("%s", buffer); 
    } 

    if (recived_len == -1) { 
     perror("read"); 
    } 

    close(sockfd); 
    return 0; 
} 

テスト

Retreiving HTML Head 
HTTP/1.1 302 Found 
Cache-Control: private 
Content-Type: text/html; charset=UTF-8 
Location: http://www.google.se/?gfe_rd=cr&ei=GZHSV-t69OTwB4uNp5gC 
Content-Length: 256 
Date: Fri, 09 Sep 2016 10:38:17 GMT 
HTTP-ヘッダー 'で終了
+0

これは、ヘッダーが255バイトより長い場合、または1つのTCPパケットに収まらない場合は機能しません。 – rustyx

関連する問題