首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简单的Http Get响应

简单的Http Get响应
EN

Stack Overflow用户
提问于 2012-10-28 07:06:14
回答 1查看 8.4K关注 0票数 7

我一直在为一个类编写一个简单的web服务器(http 1.0),但是每当我尝试获取一个文件(wget 127.0.0.1 /filename)时,它都很短。令人困惑的是,当我将发送的字节数与文件大小相加,而不是wget接收的字节数之和时。

为什么wget不能获得我写入套接字的所有数据?

一些wget输出

代码语言:javascript
运行
复制
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方法:

代码语言:javascript
运行
复制
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;
}

编辑:

我已经在这方面工作了一段时间了,我想知道我是不是做错了套接字

代码语言:javascript
运行
复制
// 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 
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-28 08:34:14

我的第一个答案是下面的,但我刚刚注意到一些事情..

代码语言:javascript
运行
复制
"Content-type: text/html \r\n \r\n";

必须用两个CR/LF将标题与内容分开。看起来你有足够的空间

您可以尝试这样做:

代码语言:javascript
运行
复制
 "Content-type: text/html\r\n\r\n";

在最后一次写入后,输出缓冲区是否被正确刷新和关闭?尝试将您的1024字节读取缓冲区的大小更改为大于gif文件的大小。这不是一个修复,但您可能会得到不同的结果,这可能有助于追踪问题的原因。也许还会在读写循环中加入一些日志。查看最后一次缓冲区写入的大小是否等于响应丢失的字节数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13104964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档