C/pp套接字,recv()/send()只在gdb下工作
C/pp Sockets, recv()/send() works only under gdb
编辑:In Socket::CanReceive()是逻辑错误。我检查的是1毫秒的输入。
我有一个问题与C套接字。send()
/recv()
不做任何事情,如果他们在非调试模式。我甚至不能std::cout
它们的返回值。由于某种原因,std::cout
在我的方法中不起作用。我也不能std::cerr
errno。在gdb中检查这一点是没有意义的,因为在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, ' ', 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;
相关文章:
- QuadTree只在窗口的右上角绘制
- fopen 在 gdb 中返回 NULL
- 用"=default"声明的函数应该只在头文件中执行
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何使C++调试语句显示在 gdb 控制台中
- "typename"不应该只在模板函数或模板类中使用吗?
- 为什么我的程序无法在GDB在线编译器/调试器或Visual Studio C++ 2019中运行
- 在 gdb 中运行 floor() 或 ceil()
- Visual Studio Debug 只在一个线程中
- 在C++中只在常量限定符上实现模板
- 在gdb中显示当前函数的调用函数
- 只在堆中创建C++对象
- Boost::log只在debian中崩溃
- 为什么字符串流只读取整数中的第一个数字?如何使它只在空白处移动?
- 在 gdb (Windows) 中添加 dll 的调试符号
- 我应该只在免费商店上为一次调用创建对象吗?
- 为什么这C++只在编译器上编码一个不明确的方法调用Microsoft?
- C++ rand() 只在 1-10 之间生成 8
- C/pp套接字,recv()/send()只在gdb下工作
- 对于库,GDB只在头文件中看到源代码,而.cpp文件中的源代码不可用