UDP 客户端服务器:通过 WAN 使用

汤姆

我有一个将数据(服务器)发送到 UDP 客户端的应用程序。只要我知道客户端的目标地址,它就可以在同一台计算机上完美运行,并且可以通过 LAN 运行。但是,当我通过 Internet 执行此操作时,它不再起作用,因为它没有目标计算机的地址。这是服务器代码:

public ServerSender(String address, Int32 port, int TTL)
{
  m_Address = address;
  m_Port = port;
  m_TTL = TTL;

  Init();
}

private Socket m_Socket;
private IPEndPoint m_EndPoint;
private String m_Address;
private Int32 m_Port;
private Int32 m_TTL;


private void Init()
{
  IPAddress destAddr = IPAddress.Parse(m_Address);

  m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

  m_EndPoint = new IPEndPoint(destAddr, m_Port);     
}

public void SendBytes(Byte[] bytes)
{
  m_Socket.SendTo(bytes, 0, bytes.Length, SocketFlags.None, m_EndPoint);
}

这是客户端:

    public void Connect(string strAddress, int port)
    {
        m_Address = IPAddress.Parse(strAddress);
        m_Port = port;

        m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); // Multicast Socket

        m_Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);

        m_EndPoint = new IPEndPoint(m_Address, m_Port);

        m_Socket.Bind(m_EndPoint);

        m_Socket.Connect(m_EndPoint);

        IsConnected = true;

        this.DoRead();
    }

    private void DoRead()
    {
        try
        {
            m_Socket.BeginReceive(bytes, 0, bytes.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), m_Socket);
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }

显然,服务器需要监听远程连接,而客户端需要连接到服务器。我认为我可以获取远程地址,然后在 SendBytes 方法中我将发送到远程端点。我尝试了许多不同的异步服务器示例,它们都会导致各种错误。是否有任何简单的方法可以更改此代码以允许它通过 Internet 连接到远程主机?谢谢

迈克尔·比尔

总结/详细说明一下评论:

  • 您有一台具有公共 IP 的主机,即直接连接到 inet(您的“服务器”)
  • 您有一台没有公共 IP 的主机,即通过某个网关/防火墙连接到 inet ......(您的“客户端”)

由于不知道大家对网络了解多少:TCP/UDP 数据包被包裹在 IP 数据包中。IP 处理 IP 地址,TCP 和 UDP 知道端口,但是:TCP 端口 1 和 UDP 端口 1 是不同的东西!

您的网络设置可能看起来像 ,带有一些示例 IP:

|--------|  47.46.43.42              |---------|192.168.0.1       |--------|
| Server |======== The INET =========| Gateway |==================| Client |
|--------|               81.82.83.84 |---------|     192.168.0.100|--------|

这里的网关是您的“路由器”。

您的客户端将被配置为将不属于本地 LAN 的任何流量发送到网关(如果您能够从客户端浏览网站,则配置正确)。

再次注意:如果目标 IP 属于“他们的”网络,网络设备会将 IP 数据包传送给正确的接收者。如果目标 IP 未知,它们将不会交付给任何人。

如果您的客户端尝试向您的服务器端口 1 发送 UDP 数据包,它将向网关发送一个包含目标 IP 47.46.43.42 和源 IP 192.168.0.100 的 IP 数据包,以及目标端口 1 和它的端口用于发送数据包(假设端口 2)。网关接收数据包,查看目标 IP 并将 IP 数据包的内容作为新的 IP 数据包发送(目标 47.46.43.42:1,源 81.82.83.84)。它必须使用另一个 UDP 端口进行发送,比如说 15。这里的关键是:它还记得它从 192.168.0.100 端口 2 向 47.46.43.42 端口 1 发送了一个数据包,它自己的端口 15。每当 UDP 数据包到达时在来自 47.46.43.42 的端口 15 上,可以假设它是一些应该转发到 192.168.0.100 端口 2 的回复。

然后,如果服务器收到数据包,它看到的只是(目标 IP 47.46.43.42:1,源 IP 81.82.83.84:83:15)。如果它想发回一个答案,它将发送一个带有 (dest 81.82.83.84:15, source 47.46.43.42:1) 的 IP 数据包。请注意,服务器只能“看到”网关,而不是它后面的客户端!网关收到数据包,回想它刚刚发送了一个 IP 数据包(dest 47.46.43.42:1,源 192.168.0.100:2),假设 IP 数据包是某种应答,并发送一个新的 IP 数据包(dest 192.168 .0.100:2, source 47.46.43.42:1) 与从服务器接收到您的客户端的内容。

注意特别是这只是因为网关从客户端收到一个数据包并从中了解到 192.168.0.100 和 81.82.83.84 '相互交谈'。正因为如此,它才知道如何处理来自您的服务器的数据包!

现在让我们尝试相反的方式。有两种可能的情况:

  1. 服务器知道您客户端的 IP (192.168.0.100)。回想一下,互联网上的任何设备都不知道这个 IP,因此如果它发出一个 IP 数据包(dest 192.168.0.100,源 81.82.83.84),它将不会到达网关,因为到达网关的唯一数据包是那些具有目标 IP 为 47.46.43.42 。这个选项永远不会起作用。

  2. 服务器知道网关的 IP 并发出一个 IP 数据包(目的地 47.46.43.42,源 81.82.83.84)。该数据包将到达网关。但是网关应该怎么做呢?它从不记得来自 IP 81.82.83.84 的数据包应该转发到您的客户端。网关学习的唯一方法是客户端首先向您的服务器发送数据包。此选项也不起作用。

因此,它并没有足够*服务器知道客户端的IP,但网关需要了解你的服务器和客户端之间的“对话”。和你的网关的工作方式要求客户端发送出一个包第一,使用精确的端口发送要进一步使用。如果您的服务器应该向您的客户端 UDP 端口 2 发送数据,则客户端必须首先从 UDP 端口 2 向服务器发送数据包。

您的网关所做的是NATTING,您最好阅读一下它。

但是,我假设您的网络有一些标准设置。这很可能,但从技术上讲,它可能完全不同,也许您的网关充当防火墙,也部分阻止传出流量,也许您的服务器配置为也将您的网关用作网关(很奇怪,但技术上可行)。

因此,离线故障排除很困难,如果我不能在这里为您提供具体问题解决方案 (TM) ,我很抱歉

PS:您可能想知道为什么您的客户端可以使用错误的目标 IP 向网关发送数据包,而您的服务器却不能。这与以下事实有关,即在以太网层,您的 LAN 是单个网络,而 Internet 不是...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Go中使用UDP的客户端/服务器

来自分类Dev

使用Qt的UDP服务器/客户端

来自分类Dev

在客户端的C编程中使用UDP检查服务器何时联机

来自分类Dev

使用C中的UDP套接字将结构从客户端传递到服务器

来自分类Dev

使用Python在UDP客户端服务器中打印消息时的编码问题

来自分类Dev

Webrtc客户端可以使用来自服务器的UDP消息吗?

来自分类Dev

在C中使用UDP进行服务器-客户端文件传输

来自分类Dev

在客户端的C编程中使用UDP检查服务器何时联机

来自分类Dev

使用NodeJS中的UDP将多个客户端连接到同一服务器

来自分类Dev

为什么DHCP使用UDP端口67和68进行客户端和服务器之间的通信?

来自分类Dev

我可以将ZeroMQ TCP / UDP服务器与常规BSD TCP / UDP套接字客户端混合使用吗?

来自分类Dev

UDP服务器客户端Java

来自分类Dev

编写客户端和服务器,UDP

来自分类Dev

C#UDP服务器与客户端对话

来自分类Dev

UDP服务器客户端Java

来自分类Dev

UDP中的服务器-客户端

来自分类Dev

Java UDP 客户端未从服务器接收(简单的客户端服务器 udp 代码)

来自分类Dev

使用Python的简单“聊天” UDP客户端和服务器,不能将“ str”用作“ send()”有效负载

来自分类Dev

使用UDP处理多个客户端

来自分类Dev

UDP服务器和UDP客户端之间的区别:sock.bind((host,port))在客户端还是服务器端?

来自分类Dev

UDP 客户端/服务器程序,通过不同 IP 和端口上的 2 个套接字进行通信

来自分类Dev

UDP客户端未收到UDP服务器消息

来自分类Dev

Windows客户端不使用通过DHCP提供的NTP服务器

来自分类Dev

更改OpenVPN客户端,是否可以通过scp使用相同的服务器配置?

来自分类Dev

Telnet服务器可以通过协议检测正在使用的客户端吗?

来自分类Dev

通过SSH和身份验证密钥使用的客户端和服务器连接

来自分类Dev

如何使用服务器通过ssh客户端连接2台PC?

来自分类Dev

如何使用 Java 客户端和 Python 服务器通过套接字创建 IPC?

来自分类Dev

在客户端-服务器模型中使用休眠

Related 相关文章

  1. 1

    在Go中使用UDP的客户端/服务器

  2. 2

    使用Qt的UDP服务器/客户端

  3. 3

    在客户端的C编程中使用UDP检查服务器何时联机

  4. 4

    使用C中的UDP套接字将结构从客户端传递到服务器

  5. 5

    使用Python在UDP客户端服务器中打印消息时的编码问题

  6. 6

    Webrtc客户端可以使用来自服务器的UDP消息吗?

  7. 7

    在C中使用UDP进行服务器-客户端文件传输

  8. 8

    在客户端的C编程中使用UDP检查服务器何时联机

  9. 9

    使用NodeJS中的UDP将多个客户端连接到同一服务器

  10. 10

    为什么DHCP使用UDP端口67和68进行客户端和服务器之间的通信?

  11. 11

    我可以将ZeroMQ TCP / UDP服务器与常规BSD TCP / UDP套接字客户端混合使用吗?

  12. 12

    UDP服务器客户端Java

  13. 13

    编写客户端和服务器,UDP

  14. 14

    C#UDP服务器与客户端对话

  15. 15

    UDP服务器客户端Java

  16. 16

    UDP中的服务器-客户端

  17. 17

    Java UDP 客户端未从服务器接收(简单的客户端服务器 udp 代码)

  18. 18

    使用Python的简单“聊天” UDP客户端和服务器,不能将“ str”用作“ send()”有效负载

  19. 19

    使用UDP处理多个客户端

  20. 20

    UDP服务器和UDP客户端之间的区别:sock.bind((host,port))在客户端还是服务器端?

  21. 21

    UDP 客户端/服务器程序,通过不同 IP 和端口上的 2 个套接字进行通信

  22. 22

    UDP客户端未收到UDP服务器消息

  23. 23

    Windows客户端不使用通过DHCP提供的NTP服务器

  24. 24

    更改OpenVPN客户端,是否可以通过scp使用相同的服务器配置?

  25. 25

    Telnet服务器可以通过协议检测正在使用的客户端吗?

  26. 26

    通过SSH和身份验证密钥使用的客户端和服务器连接

  27. 27

    如何使用服务器通过ssh客户端连接2台PC?

  28. 28

    如何使用 Java 客户端和 Python 服务器通过套接字创建 IPC?

  29. 29

    在客户端-服务器模型中使用休眠

热门标签

归档