从浏览器套接字接收函数,但未在缓冲区中存储任何内容

时间:2019-06-30 21:03:58

标签: c++ sockets http header recv

我需要从浏览器接收HTTP请求,当我运行localhost:8228时,它可以正常工作,我在缓冲区中接收了标头,并且能够将其写到控制台,甚至可以将其发送回浏览器。但是,当我尝试从实际网页中读取请求时,缓冲区为空,不会显示任何内容。

我有一个简单的主程序,如下所示:

int main (int argc, char *argv[]) {
  char buffer[1024*1024] = {0};
  int port_number = 8228;

  if (argc == 1)
    std::cout << "Using default port number, 8228." << std::endl;
  else if (argc == 3) {
    port_number  = atoi(argv[2]);
  } else {
    std::cout << "::Error::" << std::endl;
    std::cout << "Wrong number of arguments." << std::endl;
    exit[0];
  }

  AppSocket app;
  app.Start((int)port_number);
  app.AcceptCall();
  int request_size = app.ReceiveRequest(buffer, sizeof(buffer));

  return 0;
}

我的AppSocket函数将是:

void AppSocket::Start(int port) {
  // Create a socket
  listening_fd = socket(AF_INET, SOCK_STREAM, 0);
  if (listening_fd == -1) {
    std::cerr << "Could not create a socket." << std::endl;
    exit(-1);
  }
  app_hint.sin_family = AF_INET;
  app_hint.sin_port = htons(port); 
  inet_pton(AF_INET, "127.0.0.1", &app_hint.sin_addr);  
  if (bind(listening_fd, (sockaddr*)&app_hint, sizeof(app_hint))< 0) {
    std::cerr << "Cannot bind to IP/port." << std::endl;
    exit(-2);
  }
  std::cout << "Socket has been bound." << std::endl;

  if (listen(listening_fd, SOMAXCONN) == -1) {
    std::cerr << "Cannot listen." << std::endl;
    exit(-3);
  }

  std::cout << "Listening to port " << port << std::endl;
  std::cout << "Your socket is: " << listening_fd << std::endl;
}

void AppSocket::AcceptCall() {
  client_size = sizeof(client_addr);
  client_fd =
         accept(listening_fd, (sockaddr *)&client_addr, &client_size);

  if (client_fd < 0) {
    std::cerr << "Error connecting to client." << std::endl;
    exit(-4);
  }

  std::cout << inet_ntoa(client_addr.sin_addr)
            << " connected to port "
            << ntohs(client_addr.sin_port) << std::endl;

  close(listening_fd);
}

int AppSocket::ReceiveRequest(char *buffer, int max) {
  std::cout << "Client is: " << client_fd << std::endl;
  memset(buffer, 0, buff_size);    //clear buffer

  int n = recv(client_fd, buffer, buff_size, 0);
  if (n < 0)
  std::cerr << "A connection issue has occured." << std::endl;

  if (n == 0)
    std::cout << "Client disconected." << std::endl;

  std::cout << "recv return " << n << std::endl;
  std::cout << buffer << std::endl;

  return n;
}

当我运行并访问网页时,得到以下信息:

Using default port number, 8228.
Socket has been bound.
Listening to port 8228
Your socket is: 3
127.0.0.1 connected to port 37522
Client is: 4
recv return 3

我读过的所有问题似乎都不适合我...

编辑:抱歉,主代码中的其中一行没有被复制。 我如何反复收到?一会儿循环?我尝试了一下,却什么也没收到。

1 个答案:

答案 0 :(得分:0)

代码有效,正在发生的事情是firefox代理设置错误,当我运行localhost时,它工作正常,因为由于它使用的端口,它实际上作为服务器在工作,但是在尝试访问“真实”时网站没有。正确配置它后,它可以完成预期的工作。