多网卡 tcp指定网卡发送请求

在connect之前,先用bind函数,绑定指定的网卡ip地址即可。

SOCKET sfd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in sself;
sself.sin_family = AF_INET;
sself.sin_port = htons(t->port);
sself.sin_addr.s_addr = inet_addr(t->szIpAddr);
ret = (bind(sfd, (sockaddr *)&sself, sizeof(sself)));

if (ret < 0)
{
    printf("$(%s:%d) exit\r\n", __FILE__, __LINE__);
    return ;
}

sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(tarPort);
saddr.sin_addr.s_addr = inet_addr(szTarget);
ret = (connect(sfd, (sockaddr *)&saddr, sizeof(saddr)));
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

zpweiai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值