C# 多网卡 Server Listen

VC和BCB中做一个Server的监听程序,只需要指定端口,然后监听(Listen)就行了.在C#找不到这个函数了,慢慢看MSDN,怎么需要指定IP和Port才能监听,那么多网卡的机器应该怎么写程序呢?下面的程序可以解释怎么去做.



TcpListener 类别会提供简易的方法,用以在封锁的同步模式中聆听 (Listen) 和接受输入的连接要求。您可以使用 TcpClient 或 Socket 来连接 TcpListener 。使用 IPEndPoint 、本机 IP 地址和连接端口编号,或者就只用连接埠编号来建立 TcpListener 。如果您想要基础服务供货商为您指派那些值,请指定 Any 给本机 IP 地址和 0 给本机连接埠编号。如果选择要这样做,您可以使用 LocalEndpoint 来识别指派的信息。

使用 Start 方法开始聆听输入的连接要求。 Start 将会让输入的连接进入队列等候,一直到不是呼叫了 Stop 方法,就是已经将 MaxConnections 排入队列为止。使用 AcceptSocket 或 AcceptTcpClient ,从输入的连接要求队列取出连接。这两个方法将会封锁。如果想要避免封锁,您可以先使用 Pending 方法来判断连接要求是否可在队列中取得。

呼叫 Stop 方法关闭 TcpListener 。



这个建构函式可以让您指定要聆听输入连接尝试的本机 IP 地址和连接端口编号。使用这个建构函式之前,您必须使用所需的本机 IP 地址和连接端口编号来建立 IPEndPoint 。将这个 IPEndPoint 当作 localEP 参数传递给建构函式。

如果您不在乎要指派哪个本机地址,则可使用 IPAddress.Any 做为地址参数以建立 IPEndPoint ,而基础服务供货商将会指派最适当的网络地址。如果您有多个网络接口,这可能有助于简化应用程序。如果您不在乎要使用哪个本机连接埠,则可以指定 0 做为连接埠编号来建立 IPEndPoint 。在这种情况下,服务供货商将会指派介于 1024 和 5000 之间的可用连接埠编号。如果您使用这个途径,则可以藉由使用 LocalEndpoint 属性来探索什么局域网络地址和连接端口编号已经被指派。

呼叫 Start 方法以开始聆听输入的连接尝试。



IPEndPoint 类别包含主机以及应用程序连接到主机服务所需的通讯端口信息。藉由结合主机的 IP 地址和服务的通讯端口编号, IPEndPoint 类别形成连接至服务的连接点 (Connection Point)。



[C#]

//Creates an instance of the TcpListener class by providing a local endpoint.



IPAddress ipAddress = Dns.Resolve(Dns.GetHostName()).AddressList[0];

IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, 11000);



try{

TcpListener tcpListener = new TcpListener(ipLocalEndPoint);

}

catch ( Exception e ){

Console.WriteLine( e.ToString());


 

转载于:https://www.cnblogs.com/leonardleonard/archive/2007/03/24/1927996.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 中进行多网卡数据转发可以通过使用 Socket 类来实现。下面是一个简单的示例代码,演示了如何在两个不同的网卡之间转发数据。 ```csharp using System; using System.Net; using System.Net.Sockets; class Program { static void Main() { // 创建两个 Socket 实例,分别用于监听两个网卡 Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Socket socket2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 绑定第一个网卡的 IP 地址和端口号 IPAddress ip1 = IPAddress.Parse("192.168.1.100"); // 第一个网卡的 IP 地址 int port1 = 1234; // 第一个网卡的端口号 IPEndPoint endpoint1 = new IPEndPoint(ip1, port1); socket1.Bind(endpoint1); // 绑定第二个网卡的 IP 地址和端口号 IPAddress ip2 = IPAddress.Parse("192.168.2.100"); // 第二个网卡的 IP 地址 int port2 = 5678; // 第二个网卡的端口号 IPEndPoint endpoint2 = new IPEndPoint(ip2, port2); socket2.Bind(endpoint2); // 开始监听第一个网卡 socket1.Listen(10); Console.WriteLine($"Listening on {ip1}:{port1}"); // 开始监听第二个网卡 socket2.Listen(10); Console.WriteLine($"Listening on {ip2}:{port2}"); // 接受第一个网卡的连接请求 Socket client1 = socket1.Accept(); Console.WriteLine($"Accepted connection from {client1.RemoteEndPoint}"); // 接受第二个网卡的连接请求 Socket client2 = socket2.Accept(); Console.WriteLine($"Accepted connection from {client2.RemoteEndPoint}"); // 创建两个异步的数据转发任务,分别用于将数据从第一个网卡转发到第二个网卡,和从第二个网卡转发到第一个网卡 var forwardTask1 = ForwardData(client1, client2); var forwardTask2 = ForwardData(client2, client1); // 等待两个任务完成 forwardTask1.Wait(); forwardTask2.Wait(); // 关闭所有的连接和 Socket client1.Close(); client2.Close(); socket1.Close(); socket2.Close(); Console.WriteLine("Data forwarding completed. Press any key to exit."); Console.ReadKey(); } static async Task ForwardData(Socket sourceSocket, Socket destinationSocket) { byte[] buffer = new byte[4096]; int bytesRead; try { while ((bytesRead = await sourceSocket.ReceiveAsync(buffer, SocketFlags.None)) > 0) { await destinationSocket.SendAsync(buffer, bytesRead, SocketFlags.None); } } catch (SocketException ex) { Console.WriteLine($"Socket error: {ex.Message}"); } } } ``` 在上述示例中,我们创建了两个 `Socket` 实例 `socket1` 和 `socket2`,分别用于监听两个不同的网卡。然后,我们绑定了每个网卡的 IP 地址和端口号,并开始监听连接请求。一旦有连接请求到达,我们接受连接,并创建两个异步的数据转发任务 `forwardTask1` 和 `forwardTask2`,分别用于将数据从第一个网卡转发到第二个网卡,和从第二个网卡转发到第一个网卡。 在 `ForwardData` 方法中,我们使用异步的方式从源 `Socket` 读取数据,并将数据异步地发送到目标 `Socket`。如果发生任何的 `SocketException` 异常,则会输出错误信息。 最后,我们关闭所有的连接和 `Socket`,并在控制台上输出完成信息。 请注意,上述示例仅演示了基本的多网卡数据转发,并未处理一些特殊情况和错误处理。实际应用中,你可能需要根据具体需求进行适当的修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值