2

リッスンしている 2 つの TCP ポート間でデータを交換するのに役立つ C# レイヤーが必要です。

たとえば、リスナー ポート @ 192.168.1.2::5555 と別のリスナー ポート @ 192.168.1.4::6666 があります。

socket.connect を使用して両方のリスナーへの接続を確立することができます。2 つのスレッドの作成中に混乱しています。 ->バイトに変換 -> Sock1.write()

無限ループに陥っていると思います。両方のポートへの接続を確立して、 2 つのリスニング ポート間でパケットを交換するより良い方法はありますか?

メソッドを実装する必要があります

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

3 に答える 3

2

次のようなものになる可能性があります:(テストされていません)

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);
        }
    }
}
于 2012-10-10T08:39:34.577 に答える
1

$ついに達成しました:-) $

     private void Form1_Load(object sender, EventArgs e)
    {
        RoutingClient=new TcpClient("127.0.0.1",5765);
        ServerClient = new TcpClient("127.0.0.1", 5766);
        rcStream = RoutingClient.GetStream();
        ScStream = ServerClient.GetStream();
        //start 2 threads
        Thread t1 = new Thread(()=>ExchangePackets(rcStream,ScStream));
        t1.Start();
        Thread t2 = new Thread(() => ExchangePackets(ScStream, rcStream));
        t2.Start();
    }


    private  static void ExchangePackets(NetworkStream FirstStream, NetworkStream SecondStream)
    {
        try
        {
            while (true)
            {
                if (FirstStream.CanRead)
                {
                    byte[] myReadBuffer = new byte[1024];
                    StringBuilder myCompleteMessage = new StringBuilder();
                    MemoryStream ms = new MemoryStream();
                    int numberOfBytesRead = 0;
                    int TotalBytesRead = 0;
                    // Incoming message may be larger than the buffer size. 
                    do
                    {
                        numberOfBytesRead = FirstStream.Read(myReadBuffer, 0, myReadBuffer.Length);
                        ms.Write(myReadBuffer, TotalBytesRead, numberOfBytesRead);
                        myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
                        TotalBytesRead = TotalBytesRead + numberOfBytesRead;
                    }
                    while (FirstStream.DataAvailable);
                    MessageBox.Show("You received the following message : " +
                                                 myCompleteMessage);
                    if (SecondStream.CanWrite)
                    {

                        byte[] myWriteBuffer = ms.ToArray();
                        SecondStream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
                    }
                    else
                    {
                        MessageBox.Show("Sorry.  You cannot write to this NetworkStream.");
                    }
                }
                else
                {
                    MessageBox.Show("Sorry.  You cannot read from this NetworkStream.");
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Routing to Server:" + ex.Message);
        }
    }
于 2012-10-10T10:00:02.793 に答える
0

編集:詳しく調べてみると、私の答えはあなたの状況に適しているとは思いません。あなたの質問は、この方法での実装を妨げる可能性のある多くの固定制約について説明しています。ただし、一般的に正しいアプローチだと思うので、他の人のためにここに私の答えを残しておきます。

両方のポートへの接続を確立して、2 つのリスニング ポート間でパケットを交換するより良い方法はありますか?

車輪を再発明する必要はありません:)

WCFを使用して、 TCP トランスポートで全二重サービスを作成できますか?

于 2012-10-09T13:13:42.233 に答える