【发布时间】:2010-12-03 06:55:08
【问题描述】:
我需要创建一个连接到服务器进程的套接字,但必须限制使用指定的本地适配器。默认行为是尽其所能,但我需要确保给定的套接字仅尝试(例如)LAN 连接,前提是 wifi 和 LAN 都可用。
我正在使用 C# 和 .NET 2.0。
干杯
【问题讨论】:
我需要创建一个连接到服务器进程的套接字,但必须限制使用指定的本地适配器。默认行为是尽其所能,但我需要确保给定的套接字仅尝试(例如)LAN 连接,前提是 wifi 和 LAN 都可用。
我正在使用 C# 和 .NET 2.0。
干杯
【问题讨论】:
作为其他人的参考,我在使用 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);
}
}
【讨论】:
Socket.Bind(EndPoint localEP) 方法是你的朋友。详情请查看 MSDN 上的here。
要获取所有本地适配器及其类型,请查看 System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
【讨论】:
你可以尝试使用 bind() 函数吗? 也许这样就可以了。
在 msdn 上我发现:
(http://msdn.microsoft.com/en-us/library/ms737550(VS.85).aspx)
备注
绑定函数是必需的 在后续之前未连接的套接字 调用监听函数。它是 通常用于绑定到 面向连接(流)或 无连接(数据报)套接字。这 绑定函数也可以用来绑定 到一个原始套接字(套接字是 通过调用套接字函数创建 类型参数设置为 SOCK_RAW)。 绑定函数也可以 用于未连接的套接字 在随后调用 连接、ConnectEx、WSAConnect、 WSAConnectByList 或 WSAConnectByName 发送操作之前的功能。
通过调用创建套接字时 对于socket函数,它存在于一个 命名空间(地址族),但它有 没有分配给它的名字。 使用绑定 建立局部函数 通过分配来关联套接字 未命名套接字的本地名称。
一个名字由三个部分组成 使用 Internet 地址族: 地址家人。主机地址。一个港口 标识 应用。
【讨论】: