编辑:在 Socket::CanReceive() 中是逻辑错误。我正在检查输入 1 毫秒。这就是为什么在进入 gdb 时一切正常。
我遇到了 C 套接字的问题。 send()
/recv()
如果它们处于非 Debug模式,则不执行任何操作。我什至不能 std::cout
它们的返回值。出于某种原因,std::cout
在我的方法中不起作用。我也不能 std::cerr
errno。在 gdb 中检查是没有意义的,因为那里一切正常。 Wireshark 不会在非 Debug模式下记录数据包。
//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 也会失败。如果我不在此方法中设置断点,它将失败并且 wireshark 不会记录任何内容。我认为这可能是时间问题,所以服务器没有时间响应之类的,但你猜怎么着? sleep()
不适用于这两种方法。
我没有发布 TCP::Send()
,因为只有一行不同。
最佳答案
您没有刷新流,因此看不到输出。变化:
std::cerr << errno << "\n";
到
std::cerr << errno << std::endl;
和
std::cout << bytes;
到
std::cout << bytes << std::endl;
关于c++ - C/pp 套接字,recv()/send() 仅在 gdb 下有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24983623/