2

事前に読んで答えてくれてありがとう!

ソケット経由でサードパーティ ツールに接続する簡単な C# プログラムを作成しました。1024 文字を超える文字列を送信すると、サードパーティ ソフトウェアがエラーをスローします。現在、これがソケット コードの問題なのか、他のソフトウェア (EnergyPlus) の問題なのかを調べようとしています。

これはほんの数行のコードであり、提案があれば大歓迎です!

using System.IO;
using System.Net;
using System.Net.Sockets;
...
private int port = 1410;
private TcpListener listener;
private Stream s;
private StreamReader sr;
private StreamWriter sw;
private Socket soc;
...

ここで実際に開始します。

listener = new TcpListener(port);
listener.Start();
soc = listener.AcceptSocket();

// now, the other program connects

soc.SetSocketOption(SocketOptionLevel.Socket,
        SocketOptionName.ReceiveTimeout, 10000);

s = new NetworkStream(soc);

sr = new StreamReader(s);
sw = new StreamWriter(s);
sw.AutoFlush = true; // enable automatic flushing

sw.WriteLine("more or less than 1024 characters");

...

これは私が使用するコードです。私が忘れたことはありますか?私が世話をする必要があるものはありますか?どんな提案でもうれしいです。

E+ から得られるエラーは次のとおりです。

ExternalInterface: Socket communication received error value " 1" at time = 0.00 hours.
ExternalInterface: Flag from server " 0".
4

1 に答える 1

1

EnergyPlus によって定義された仕様を確認する必要があります。ソケット通信にはルールが必要ですここには 2 つの明らかなオプションがあります。

  1. ルールに従っていない (おそらく長さが制限されているか、このシナリオでは特別なマーカー バイトを記述する必要がある)
  2. サーバー コードが仕様を正しく実装していない (最大の原因は、バッファの問題、または論理フレームが単一のネットワーク パケットで到着することを想定している)

実際、そこには明らかな「フレーム」がないため、まだ何かを行っているのは興味深いことです。TCP はストリームなので、通常、論理メッセージを分割するためにフレームが必要です。これは通常、次のいずれかを意味します。

  • 長さのプレフィックス、他のヘッダー データの有無にかかわらず
  • 通常、テキストベースのプロトコル用の cr/lf/crlf ターミネータ (またはその他のターミネータ)
  • ソケットを閉じる (究極のターミネーター)

あなたはそれらのどれもしないので、私が書いたサーバーでは、何か他のことが起こるまで不完全なメッセージになります. テキストベースのように聞こえます。cr/lf/crlf を追加してみます

于 2012-02-11T14:18:17.817 に答える