【问题标题】:RedHat Socket not receiving packets [closed]RedHat 套接字未接收数据包[关闭]
【发布时间】:2023-03-20 01:30:01
【问题描述】:

我目前正在 RedHat 上运行一个应用程序,这会导致一些问题。 我有两台计算机都运行 RedHat 并使用 UDP 套接字进行通信。

双方都正确创建了Socket,并且客户端正确绑定了服务器。当客户端发送消息时,我可以看到在服务器端使用 TCPDump 正确接收了消息,但从未调用套接字上的函数 Receive() 并且应用程序什么也不做。

当我在 localhost 上执行此操作时,应用程序运行良好。

有人知道问题出在哪里吗?

【问题讨论】:

  • 如果函数Receive()从未被调用,为什么你会惊讶于没有收到消息?
  • 好吧,我很惊讶,因为服务器(使用 tcpdump)以正确的端口号很好地接收了数据包,但没有任何反应。它应该正常进入Receive函数而不是什么都不做,希望你明白我的意思
  • 你在说什么Receive()函数?它会是您尚未发布的代码中的那个吗?是通过您尚未披露的一连串事件达成的?
  • 对不起,我说的是 recv() 函数 (man7.org/linux/man-pages/man2/recv.2.html)。我对此很陌生,所以我可能会忘记一些事情。我还要补充一点,这个应用程序可以在 32 位的 opensuse 操作系统上完美运行,但现在它不能在 red hat 64 位上运行
  • 我怀疑你的逻辑有问题导致recv,或者你的服务器上有防火墙,它丢弃了数据包。

标签: c++ sockets udp client-server redhat


【解决方案1】:

当您执行tcpdump 时,您实际上是在尝试了解数据包是否已到达目标机器,而不是实际目标(即正在侦听的应用程序,换句话说,您的服务器程序)。 tcpdump 只能保证数据包到达服务器机器并且 TCP 堆栈有它。现在由您的应用程序(即服务器程序)来使用它。只有当recv() 成功时才会发生这种情况。您始终可以了解所有套接字函数背后的错误并执行必要的纠正措施。

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    相关资源
    最近更新 更多