[英]C/pp Sockets, recv()/send() works only under gdb
编辑:在Socket :: CanReceive()中是逻辑错误。 我正在检查输入1毫秒。 这就是为什么在进入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也会失败。 如果我没有在此方法中设置断点,则它将失败,并且将不会记录任何日志。 我认为这可能与计时有关,所以服务器没有时间响应或什么,但是您猜怎么着? sleep()
在两种方法中都不起作用。 我不发布TCP::Send()
,因为只有区别。
您没有刷新流,因此看不到输出。 更改:
std::cerr << errno << "\n";
至
std::cerr << errno << std::endl;
和
std::cout << bytes;
至
std::cout << bytes << std::endl;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.