3

私は奇妙な問題を抱えており、誰かの助けが必要です。プロキシ チェーンの一部として機能するプログラムがあります。あるものからデータを取り込み、別のものに送信します。私が抱えている唯一の問題は、受信メソッドが何も取り込まないことです。そこでフリーズするだけです。私のプログラム:

チェーンに A、B、C、D の 4 つのノードがあるとします。

A はウェブブラウザ

B は私の C# プログラムです

C は私の C# クライアントです

Dはウェブサイト

B は C と A の両方をリッスンしています。非常に奇妙ですが、それを構成する必要があります。どうすればこのいまいましいプログラムを動作させることができますか? すでにかなりの量のコードをセットアップしていますが、何らかの理由で C は B から何も受信していません。C は B に正常に接続していますが、C は何も受信していません。誰でも私を助けることができますか?

すべてのポートを開いています。ファイアウォールは B と C の両方でオフになっています。A と B はどちらもローカル マシンで実行されています。いくつかの IP を与えるには:

A は 127.0.0.1:3056 に接続します

B は 127.0.0.1:3056 をリッスンし、B は IPAddress.Any:3055 をリッスンします。

C は MY_IP_ADDRESS:3055 に接続し、C は B が指定した場所に接続します

MY_IP_ADDRESS は、whatismyip.com から取得したグローバル IP アドレスです。

C が何も受信しないのはなぜですか? ここにいくつかの周囲のコードがあります:

クライアント (C):

Socket reqSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("MY_IP_ADDRESS"), 3055);
reqSocket.Connect(ip);
byte[] ReqData = new byte[8192];
MessageBox.Show("BYTE"); // This runs, (click OK)
reqSocket.Receive(ReqData);
String ReqString = Encoding.UTF8.GetString(ReqData);
MessageBox.Show(ReqString); // This does not

サーバー (B):

TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 3056);
listener.Start();
Socket Localhost = listener.AcceptSocket();
listener.Stop();
TcpListener listener2 = new TcpListener(IPAddress.Any, 3055);
listener2.Start(50);
Socket toSocket = listener2.AcceptSocket();
listener2.Stop();
byte[] buf = new byte[8192];
Localhost.Receive(buf);
toSocket.Send(buf);
MessageBox.Show("Sent!"); // This runs

これらは両方とも実際に同時に開いています。

4

1 に答える 1

3

クライアントとサーバーの両方がReceive開始時に呼び出しを行っています。したがって、クライアントとサーバーの両方が、少なくとも1 バイトを返すか、EOF を報告できるようになるまでブロックされます。どちらも着信データを待っているため、実際にはどちらも何も送信しません。だから:デッドロック。

また、どちらの呼び出しも、読み取られたデータReceiveの量を示す戻り値を取得できません。これは大きなエラーです。特に、完全な数の文字があることさえ保証できない場合、マルチバイトエンコーディング (UTF-8 など) でデコードすることはできません。 50 文字のシーケンス。

于 2013-06-25T22:11:32.177 に答える