【问题标题】:Packet forwarded to destination, but application doesnt receive数据包转发到目的地,但应用程序没有收到
【发布时间】:2013-05-07 06:52:54
【问题描述】:

我正在尝试在我的机器上运行一个简单的客户端-服务器程序。如果客户端和服务器都在同一个系统上,它工作正常。但是,如果客户端在另一个系统上并且服务器在我的系统上运行,它就不起作用。它反过来工作。 当我执行 netstat 命令时,它从客户端显示 SYN_SENT,但服务器仍然显示 LISTENING。 Wireshark 确认它收到了来自客户端的消息,但消息仍然没有到达服务器。

我在 Windows XP 上运行。

这是客户端网络统计

TCP    si-rohitp:5002         10.221.40.62:5003      SYN_SENT

这是服务器端网络统计

TCP    127.0.0.1:1045         0.0.0.0:0              LISTENING
 TCP    127.0.0.1:5152         0.0.0.0:0              LISTENING

【问题讨论】:

  • 显示netstat的输出,尤其是LISTENING套接字。
  • 你试过不运行wireshark吗?
  • @DavidSchwartz 更新
  • 服务器只监听 127.0.0.1:1045 和 127.0.0.1:5152。从机器外部都无法访问它们。

标签: c windows sockets


【解决方案1】:

您的服务器程序只监听本地主机。在进行套接字编程时,您的程序不仅列出了一个特殊的端口,它还监听了一个特定的 IP 地址。如果一个程序侦听本地主机,这将导致我的程序永远不会连接到您的计算机外部。重写服务器程序中的代码以监听它的 IP 地址。您可以借助网络功能查找运行服务器程序的计算机的当前IP地址。

如果您的程序不仅要使用套接字进行计算机内部通信,那么您应该始终绑定到真实 IP 地址。如果您的程序仅使用套接字进行内部通信,则应始终绑定到本地主机,因为安全性较低。

如果您无权访问服务器程序的源代码,并且无法自定义服务器程序的行为,那您就完蛋了。

【讨论】:

    【解决方案2】:

    当您调用 bind 时,您需要指定要将套接字绑定到哪些地址。如果您传入 INADDR_ANY,它将绑定到所有设备,因此您将能够从本地和远程主机获取连接。

    http://man7.org/linux/man-pages/man7/ip.7.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 2015-11-17
      • 2014-01-23
      • 2016-10-17
      • 2018-10-02
      • 1970-01-01
      相关资源
      最近更新 更多