【问题标题】:Setting a socket's local endpoint设置套接字的本地端点
【发布时间】:2010-12-03 06:55:08
【问题描述】:

我需要创建一个连接到服务器进程的套接字,但必须限制使用指定的本地适配器。默认行为是尽其所能,但我需要确保给定的套接字仅尝试(例如)LAN 连接,前提是 wifi 和 LAN 都可用。

我正在使用 C# 和 .NET 2.0。

干杯

【问题讨论】:

    标签: c# .net sockets


    【解决方案1】:

    作为其他人的参考,我在使用 Bind 时遇到了问题,因为我正在使用 UdpClient 类并访问其内部 Socket(通过 UdpClient.Client),无论我如何尝试 Bind,都会抛出 SocketException。我的workaround 依赖于首先创建和绑定 Socket,然后将其分配给 UdpClient 实例:

    using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
    {
        var endPoint = new IPEndPoint(ip, port);
        socket.Bind(endPoint);
        using (var client = new UdpClient() {Client = socket})
        {
            var destinationIP = IPAddress.Broadcast;
            client.Connect(destinationIP, port);
            client.Send(bytes, bytes.Length);
        }
    }
    

    【讨论】:

      【解决方案2】:

      Socket.Bind(EndPoint localEP) 方法是你的朋友。详情请查看 MSDN 上的here

      要获取所有本地适配器及其类型,请查看 System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()

      【讨论】:

      • 应该是 System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()。
      【解决方案3】:

      你可以尝试使用 bind() 函数吗? 也许这样就可以了。

      在 msdn 上我发现:

      (http://msdn.microsoft.com/en-us/library/ms737550(VS.85).aspx)

      备注

      绑定函数是必需的 在后续之前未连接的套接字 调用监听函数。它是 通常用于绑定到 面向连接(流)或 无连接(数据报)套接字。这 绑定函数也可以用来绑定 到一个原始套接字(套接字是 通过调用套接字函数创建 类型参数设置为 SOCK_RAW)。 绑定函数也可以 用于未连接的套接字 在随后调用 连接、ConnectEx、WSAConnect、 WSAConnectByList 或 WSAConnectByName 发送操作之前的功能。

      通过调用创建套接字时 对于socket函数,它存在于一个 命名空间(地址族),但它有 没有分配给它的名字。 使用绑定 建立局部函数 通过分配来关联套接字 未命名套接字的本地名称。

      一个名字由三个部分组成 使用 Internet 地址族: 地址家人。主机地址。一个港口 标识 应用。

      【讨论】:

      • bind() 是正确的查看方法,但 OP 要求使用 C#。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 2014-05-31
      • 2011-06-14
      • 2012-06-12
      相关资源
      最近更新 更多