c# - 在 2 个监听器之间桥接异步全双工 TCP 通信

标签 c# sockets asynchronous tcp

我需要一个 C# 层来帮助在正在监听的两个 TCP 端口之间交换数据。

例如,有一个监听端口@192.168.1.2::5555,另一个监听端口@192.168.1.4::6666。

我可以使用 socket.connect 建立与两个监听器的连接 我在创建 2 个线程时感到困惑 1> Sock1.read()->转换为字节->sock2 .write() 2> Sock2.read()->转换为字节-> Sock1.write()

我认为这正在进入无限循环。有没有更好的方法通过建立到两个端口的连接来在2个监听端口之间交换数据包?

我必须实现一个方法

Private void ExchangePackets(IpEndpoint ipe1,IpEndpoint ipe2)
{
//code here
}

最佳答案

它可以是这样的:(未测试)

void ExchangePackets(IPEndPoint ipe1, IPEndPoint ipe2)
{
    TcpClient tcp1 = new TcpClient();
    tcp1.Connect(ipe1);

    TcpClient tcp2 = new TcpClient();
    tcp2.Connect(ipe2);

    Task.Factory.StartNew(() => ByPass(tcp1, tcp2), TaskCreationOptions.LongRunning);
    Task.Factory.StartNew(() => ByPass(tcp2, tcp1), TaskCreationOptions.LongRunning);
}

void ByPass(TcpClient tcp1, TcpClient tcp2)
{
    using (tcp1)
    using (tcp2)
    {
        Stream s1 = tcp1.GetStream();
        Stream s2 = tcp2.GetStream();
        byte[] buf = new byte[0x10000];

        int len = s1.Read(buf, 0, buf.Length);
        while (len > 0)
        {
            s2.Write(buf, 0, len);
            len = s1.Read(buf, 0, buf.Length);
        }
    }
}

关于c# - 在 2 个监听器之间桥接异步全双工 TCP 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12800813/

相关文章:

c# - 如何以编程方式退出第二个消息循环?

java - 如何使用 "implements Runnable"调用特定套接字线程中的方法?

sockets - 如何将 socat 与 heredoc 一起使用?

ios - 等待异步 web 服务调用响应以处理下一个 web 服务 ios

具有无限循环的异步任务之间的 C# 同步?

c# - 尝试连接到azure数据库突然停止工作,抛出异常

c# - Parallel.For 循环执行速度比 for 慢

.net - Task.Factory.FromAsync 和 RegisterWaitForSingleObject - 后者不会扼杀前者的用处吗?

c# - 从 csx 脚本引用 NuGet 包

sockets - 我们可以使用 IP 地址和进程 ID 组合来代替 IP 地址和端口号吗?为什么以及为什么不呢?