C / pp Sockets, recv () / send () работает только под GDB

0

EDIT: В Socket :: CanReceive() была логическая ошибка. Я проверял вход 1 milisecond. Вот почему, когда ступили в gdb, все сработало.

У меня проблема с сокетами C. send()/recv() ничего не делают, если они находятся в режиме без отладки. Я не могу даже std::cout вернуть их значение. По какой-то причине std::cout не работает в методе "Мой". Я тоже не могу std::cerr errno. Нет смысла проверять это в gdb, потому что все работает отлично. Wireshark не регистрирует пакеты в режиме без отладки.

  //b - buffer
  //s - size
  //sd - socket descriptor
  int32_t TCP::Receive(char* b, uint32_t s)
  { Error::Critical.SetErrorNumber(Error::List::NoError);
    if (!Socket::Validate(sd))
    { Error::Critical.SetErrorNumber(Error::List::InvalidSocket);
      return -1;
    }

    if (Disconnected())
    { Error::Critical.SetErrorNumber(Error::List::NotConnected);
      return -1;
    }

    if (!Socket::CanReceive(sd, readTimeout))
     return false;

    if (!b)
    { b = new char [s + 1];
      std::memset(b, '\0', s + 1);
    }

    int32_t bytes = recv(sd, b, s, 0);
    if (bytes == -1)
    { Error::Critical.SetErrorNumber(errno);
      std::cerr << errno << "\n";
      return false;
    }
    std::cout << bytes;
    return bytes;
  }

Интересным фактом является то, что gdb без шага тоже терпит неудачу. Если я не установил точку останова в этом методе, это не сработает, и wirehark ничего не регистрирует. Я думал, что это может быть проблема с таймингом, поэтому сервер не успевает ответить или что-то в этом роде, но угадайте, что? sleep() не работает в обоих методах. Я не отправляю TCP::Send(), потому что есть только строка различия.

  • 0
    Пожалуйста, не добавляйте слово «решено» в заголовок вашего вопроса. Чтобы показать, что ваша проблема решена, нужно принять ответ. Если ни один из существующих ответов не является правильным (я не проверял), вы можете опубликовать ответ самостоятельно и принять его.
Теги:
sockets
debugging

1 ответ

2

Вы не очищаете потоки, поэтому вы не видите вывод. Изменить:

  std::cerr << errno << "\n";

в

  std::cerr << errno << std::endl;

а также

  std::cout << bytes;

в

std::cout << bytes << std::endl;
  • 0
    Я сделал сброс, используя std :: endl и std :: cout.flush (). Оба метода не работают. Даже если это может сработать, это все равно не объясняет, почему sleep () не влияет на метод.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню