Функция recv из сокета браузера, но ничего не сохраняет в буфере - PullRequest
1 голос
/ 01 июля 2019

Мне нужно получить 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

Ни один из вопросов, которые я прочитал, кажется, не работает для меня ...

edit: извините, одна из строк в основном коде не была скопирована. Как я могу получить повторно? Цикл пока? Я попробовал это и просто ничего не получал.

1 Ответ

0 голосов
/ 02 июля 2019

Код работает, происходит то, что настройки прокси-сервера firefox были неправильными, когда я запускал localhosts, он работал нормально, потому что он фактически работал в качестве сервера из-за порта, который он использовал, но при попытке получить доступ к «реальному»на сайте это не так.После правильной настройки он сделал именно то, что должен.

...