C/pp套接字,recv()/send()只在gdb下工作

C/pp Sockets, recv()/send() works only under gdb

本文关键字:只在 gdb 工作 send pp recv 套接字      更新时间:2023-10-16

编辑: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;