c++ - C/pp 套接字,recv()/send() 仅在 gdb 下有效

标签 c++ c sockets debugging

编辑:在 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/

相关文章:

c++ - 继承 - 查找类对象的大小

Java - 奇怪的挂套接字?

python - 绑定(bind)到 mac os x 上的 mdns 多播地址

python - 线程 WebSocket 服务器中的 Ping 和 Pong (Python)

c++ - "extern PACKAGE TMyForm * MyForm"是什么意思

c++ - 我必须在 <iostream> 旁边使用#include <string> 吗?

c++ - ptrdiff_t 可以表示指向同一数组对象的元素的指针的所有减法吗?

c - SPI_IOC_MESSAGE 返回 EINVAL

c - 返回函数 c 中的结构

c - printf() 仍然有效,尽管缺少参数