2011-09-11 13 views
0

基本的なことは、ソケット経由でブラウザのHTTP GET要求をキャプチャし、その要求をインターネットに送信し、それをブラウザに戻します。転送がテキストのみで構成されている場合、すべてのものが完全に機能します。しかし、イメージをダウンロードするとき。ブラウザはエラー「エラーが含まれているため画像を表示できません」を表示します。どんな助けでも大歓迎です。Webブラウザは、符号なしの文字配列を介して渡されたイメージを解釈しません。

#include "cc352.h" 
#include <arpa/inet.h> 
#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 

int 
main(int argc, char **argv) 
{ 
int     listenfd, connfd,weblin,webcon,webwrite,n,x,y,w,w1; 
socklen_t   len,wlen; 
struct sockaddr_in servaddr, cliaddr , webservad , webcliad; 
unsigned char  buff[3072] , buff2[3072] ,ext[5] ,wbuff[100000]; 
time_t    ticks; 
int     yes = 1; 
const char   *ptr; 


if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ 
    fprintf(stderr, "socket creation failed\n"); 
    exit (1); 
    } 

bzero(&servaddr, sizeof(servaddr)); 
servaddr.sin_family  = AF_INET; 

if (inet_pton(AF_INET,"127.0.0.1", &servaddr.sin_addr) <= 0){ 
    printf("inet_pton error for %s", argv[1]); 
    return 1; 
    } 
servaddr.sin_port  = htons(4619); 

if ((bind(listenfd, (SA *) &servaddr, sizeof(servaddr))) < 0) { 
    fprintf(stderr, "bind failed\n"); 
    exit (1); 
    fprintf(stdout, "bindd completed\n"); 
    } 


if ((weblin = socket(AF_INET, SOCK_STREAM, 0)) < 0){ 
    fprintf(stderr, "socket creation failed\n"); 
    exit (1); 
    } 
printf("weblin socket created \n"); 

bzero(&webservad, sizeof(webservad)); 
webservad.sin_family  = AF_INET; 
webservad.sin_port  = htons(80); 

if (inet_pton(AF_INET,"208.80.152.211", &webservad.sin_addr) <= 0){ 
    printf("inet_pton error for %s", argv[1]); 
    return 1; 
    } 


if (connect(weblin, (SA *) &webservad, sizeof(webservad)) < 0) { 
    printf("weblin connect error"); 
    return 1; 
    } 
printf("weblin connected \n"); 


if (listen(listenfd, LISTENQ) < 0) { 
    fprintf(stderr, "listen failed\n"); 
    exit (1); 
    fprintf(stderr, "listning\n"); 
    } 


    len = sizeof(cliaddr); 
    if ((connfd = accept(listenfd, (SA *) &cliaddr, &len)) < 0) { 
    fprintf(stderr, "accept failed\n"); 
    exit (1); 
    } 
fprintf(stdout, "Connection accepted\n"); 


     int d=0; 

      read(connfd,&buff, 3071); // Reads GET request from browser save it to array buff 
      unsigned char bron[strlen(buff)]; 

      for(d=0 ; d<=sizeof(bron) ; d++){ 
      bron[d]=buff[d]; 
      } 
      write(weblin,bron, sizeof(bron)); // Send the data to Internet 
      printf("%s \n",bron); 


      while(d=read(weblin,&wbuff, 100000)>0){ //Reads the reply from Internet and save it to wbuff 
      unsigned char wron[strlen(wbuff)]; 

      for(d=0 ; d<=sizeof(wron) ; d++){ 
      wron[d]=wbuff[d]; 
      } 
      write(connfd,wbuff,strlen(wbuff)); //Writes the reply to the browser 
      printf("%s \n",wron); 
    } 


close(connfd); 
close(listenfd); 
close(weblin); 
} 
+0

これをデバッグしようとしましたか?たとえば、これが画像をどのように扱うかを見てみましょう。 (すなわち、バイト*同一*?) –

答えて

5

strlen0が終了されるC文字列、のためのものです。 0は、バイナリイメージファイルの途中で完全に有効です。だからあなたはおそらくあなたが持っているほど多くのデータを送信していないでしょう。 (あなたが得たよりも、さらによりデータ、画像は0を含むようにないを起これば、あなたのバッファが、開催することになっているものよりもおそらくもっと。)

はあなたが渡されました緩衝液で何かを決してreadコールが成功したかどうかを確認しない場合は、readに変更してください。 readの戻り値を使用する必要があるのは、データがどれだけあるかを示す唯一の値だからです。

あなたは、全体の要求を1回のreadコールで読むと仮定しています。それを保証するものは何もない。

(私はあなたのコードに不必要にwron、およびbronで何をしようとして理解していない。そして、memcpy機能があります。むしろ、自分自身をロールよりも、それを使用してください。)

(そして、あなたのすべてのwriteコールのリターンコードを確認する必要があります。

0

私はあなたのコードを完全に通過しませんでした。しかし、問題の1つは、確実にストリングバッファー(つまり、NULL終了バッファー)としてバッファーを扱うことです。特にバッファのサイズを見つけるためにstrlen()を使用する。例えば

(あなたのコードの末尾に)この行:

write(connfd,wbuff,strlen(wbuff)) 

これは、画像と同様に、プレーンテキストデータが含まれていない任意のペイロード、失敗します。

関連する問題