7

私はクラス用の単純なWebサーバー(http 1.0)を作成してきましたが、ファイル()を取得しようとするとwget 127.0.0.1 /filename、数バイトが短くなります。紛らわしいのは、送信されたバイト数を合計するとファイルサイズと一致しますが、wget受信する量は一致しないことです。

wgetソケットに書き込んだすべてのデータを取得できないのはなぜですか?

いくつかのwget出力

wget:

    --2012-10-27 19:02:00--  (try: 4)  http://127.0.0.1:5555/
    Connecting to 127.0.0.1:5555... connected.
    HTTP request sent, awaiting response... 200 Document follows
    Length: 5777 (5.6K) [text/html]
    Saving to: `index.html.6'

    99% [=====================================> ] 5,776       --.-K/s   in 0s      

    2012-10-27 19:02:00 (322 MB/s) - Read error at byte 5776/5777 (Connection reset by peer).  Retrying.


    --2012-10-27 19:03:52--  (try: 4)  http://127.0.0.1:5555/ZoEY8.jpg
    Connecting to 127.0.0.1:5555... connected.
    HTTP request sent, awaiting response... 200 Document follows
    Length: 163972 (160K) [image/jpeg]
    Saving to: `ZoEY8.jpg.4'

    91% [==================================>    ] 149,449     --.-K/s   in 0.001s  

    2012-10-27 19:03:52 (98.8 MB/s) - Read error at byte 163917/163972 (Connection reset by peer). Retrying.

Getメソッド:

void *
processGetRequest(requestParser request)
{

  string resp= "HTTP/1.0 200 Document follows\r\nServer: lab5 \r\nContent-Length: ";
  string path="";
  path =request.path;

  //find file
  int page= open (path.c_str(),O_RDONLY);
  FILE * pageF= fdopen(page,"rb"); 


  //get size
  fseek(pageF, 0L, SEEK_END);
  int sz = ftell(pageF);
  fseek(pageF, 0L, SEEK_SET);

  //form content length
  stringstream ss;
  ss<<resp<<sz<<"\r\n";
  resp=ss.str(); 

  //make response
  if(page<0){
      cout<<"404 \n";
    resp = "HTTP/1.0 404 File Not Found\r\nServer: lab5 \r\nContent-type: text/html \r\n \r\n";

    write( request.fd, resp.c_str(), resp.length());

  return 0; 
  }
  if(path.find(".gif")!=string::npos)
   resp += "Content-type: image/gif\r\n \r\n";
  else if(path.find(".png")!=string::npos)
   resp += "Content-type: image/png\r\n \r\n";
  else if(path.find(".jpg")!=string::npos)
   resp += "Content-type: image/jpeg\r\n \r\n";
  else
   resp += "Content-type: text/html \r\n \r\n";

  //write response
  write( request.fd, resp.c_str(), resp.length());

  int total=0;      
  char buff[1024];
  int readBytes = 0;
  int er;

  //send file
  do{

  readBytes= read(page, buff, 1024);
  cout<<"read bytes "<<readBytes<<"\n";

  if(readBytes<0){
    perror("read");

    break;
  }
  total+=readBytes;
  er=  send( request.fd, buff, readBytes,0 );   
  cout<<"sent bytes "<<er<<"\n";
  if (er==-1){
    perror("send");
  }
  else if( er != readBytes){
    cout<<"Read write miss match\n";
  }

 }while(readBytes>0);

 close(page);
 return 0;
}

編集:

私はこれに取り組んでいますが、私は自分のソケットを間違ってやっているかどうか疑問に思っています

// Set the IP address and port for this server
struct sockaddr_in serverIPAddress; 
memset( &serverIPAddress, 0, sizeof(serverIPAddress) );
serverIPAddress.sin_family = AF_INET;
serverIPAddress.sin_addr.s_addr = INADDR_ANY;
serverIPAddress.sin_port = htons((u_short) port);

// Allocate a socket
int masterSocket =  socket(PF_INET, SOCK_STREAM, 0);
if ( masterSocket < 0) {
  perror("socket");
  exit( -1 );
}

while ( 1 ) {

// Accept incoming connections
struct sockaddr_in clientIPAddress;
int alen = sizeof( clientIPAddress );
int slaveSocket = accept( masterSocket,
              (struct sockaddr *)&clientIPAddress,
              (socklen_t*)&alen);
// send slaveSocket to get method 
}
4

1 に答える 1

1

私の最初の答えは以下ですが、私は何かに気づきました..

"Content-type: text/html \r\n \r\n";

ヘッダーは、2 つの CR/LF でコンテンツから分離する必要があります。そこにスペースができたようです

あなたはこれを試すことができます:

 "Content-type: text/html\r\n\r\n";

最後の書き込みの後、出力バッファは正しくフラッシュされ、閉じられていますか? 1024 バイトの読み取りバッファーのサイズを gif ファイルよりも大きいサイズに変更してみてください。これは修正ではありませんが、異なる結果が得られる可能性があり、問題の原因を突き止めるのに役立つ場合があります。多分また、読み書きループにいくつかのログを入れます。最後のバッファ書き込みのサイズが、応答が欠落しているバイト数と等しいかどうかを確認します。

于 2012-10-28T00:34:14.157 に答える