【问题标题】:How to correctly use sockets over the internet in C#?如何在 C# 中通过 Internet 正确使用套接字?
【发布时间】:2017-09-02 11:52:44
【问题描述】:

我的 Socket 在我的本地网络中正常工作,但是将程序发送给朋友时,他无法连接到我。

我使用此代码托管服务器:

Socket listener = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);

listener.Bind(new IPEndPoint(IPAddress.IPv6Any, 30000));
listener.Listen(500);

他使用我的外部 IP 地址(来自http://whatismyip.org/)和我指定的端口(30000)连接到这个服务器,代码如下:

Socket inOut = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
inOut.Connect(new IPEndPoint(IPAddress.Parse(textBox5.Text), 30000));

使用 cmd netstat -a 时,我找不到端口为 30000 的监听条目,所以我猜我的服务器设置错误或者我需要指定不同的东西,但我已经在路由器中打开了端口 (30000)。

【问题讨论】:

  • 如果我错了,请纠正我,但不将方法 .Listen(int Port) 作为参数?这意味着您在端口 500 上监听?
  • 数字为积压,指定可能的连接数
  • @Loading 更准确地说,它是可以排队等待被调用Socket.(Begin)Accept() 的服务器接受的最大连接数。这不是服务器一次可以使用的最大接受连接数。

标签: c# sockets networking


【解决方案1】:

如果满足所有这些条件,您所展示的代码应该工作:

  • 您的 ISP 已为您的 Internet 连接分配了 IPv6 地址。询问您的 ISP。许多 ISP 还没有为家庭用户这样做。如果您的 ISP 没有,您的客户端将不得不改用 AddressFamily.InterNetwork (IPv4)。根据您的客户端想要连接的 IP 类型,它需要创建一个适当的 Socket 类型。 IPv4 套接字无法连接到 IPv6 IP 地址,IPv6 套接字也无法连接到 IPv4 地址(除非将其配置为 dual-stack socket)。

  • 您的 ISP 没有阻止到您的 Internet IP 的入站 TCP 连接。许多 ISP 都这样做,因此他们可以向客户收取额外费用以托管自己的服务器。大多数家庭互联网用户不需要运行自己的服务器。询问您的 ISP 是否为您的 Internet 帐户启用了此功能。

  • 您的路由器已配置为将路由器的公共 IP 地址在端口 30000 上接收到的入站数据包转发到端口 30000 上的服务器 LAN IPv6 地址。如果您的路由器没有公共 IPv6地址(因为 ISP 没有分配地址),您必须在客户端使用 AddressFamily.InterNetwork。因为路由器位于客户端和服务器之间,所以它们可以使用不同的 IP 版本与路由器通信。

  • listener.Listen() 无错误退出后,您的服务器代码正在调用listener.Accept()Listener. BeginAccept()。如果您的代码已经在本地 LAN 上运行,这是给定的,但无论如何我都会把它扔进去。

【讨论】:

    【解决方案2】:

    尝试使用AddressFamily.InterNetwork 而不是AddressFamily.InterNetworkV6

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 2020-08-05
      相关资源
      最近更新 更多