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()
, потому что есть только строка различия.
Вы не очищаете потоки, поэтому вы не видите вывод. Изменить:
std::cerr << errno << "\n";
в
std::cerr << errno << std::endl;
а также
std::cout << bytes;
в
std::cout << bytes << std::endl;