繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM