2011-07-23 10 views
0

私のアプリケーションはデバイスに接続し、1つのソケット接続で複数のコマンドを送信します。これは、これらの基本的な構造への応答を読み取るコマンド1複数のstream.writesと読み取りを1つのソケットで行う方法

stream.write

stream.read

コマンド2

stream.write

ストリーム

あります。読み取り

。 。

これを行うより良い方法があるのだろうかと思います。これはプログラムの残りのスレッドとは異なるスレッドで実行されているため、ブロックすることについて心配していません。私が遭遇している問題は、コマンド1のデータがコマンド2のために読み込まれることがあるということです。もう1つは、コマンドに固有の1バイト目です。

任意のヘルプは、TCPを仮定

+0

private Queue<Notification> _notificationsBuffer = new Queue<Notification>();//Or use BlockingCollection if your are using 4.0 

をあなたが示すことができます私たちのコード? – svick

答えて

0

をいただければ幸いです - それが送られた各コマンドが読み込まれることを保証する方法はありません。宛先側では、各コマンドを断片化したり、他のコマンドに結合したりすることができます。そのため、境界線の境界を手動で決定する必要があります。

一般的な手法は、コマンドの先頭に長さを付け、最初に読み取ることができ、次のバイトの前に読み込むバイト数を正確に知ることです。宛先側では、通常、受信したすべてのデータをプッシュする何らかの種類のキューがあり、完全に受信したコマンドが1つ以上ある場合にのみ、キューで1つのコマンドを読み込みます。

別のスレッドを使用している場合でも、本当にいかなる状況下でもブロッキングソケットを使用することはお勧めできません。同じソケットで送受信を行う必要がある場合は、待機中のデータがないときにReadを呼び出そうとしたときに問題が発生し、受信するまでデータを送信できなくなる可能性があります。

ブロッキングコールを使用するのではなく、BeginRead,EndReadを非同期受信に使用すると、これらの不安を抱えずに同じスレッドで送受信できます。

0

あなたがマルチスレッドであるため、同様にコマンドを送信して周りのロックを使用します。

public void SendCommand(Command command) 
{ 
    lock (_commandLocker) 
    { 
     stream write 
     stream read 
    } 
} 

だから、一度に一つだけのコマンドがデータを送受信します。しかし

、いつでもデバイスからデータを受信して​​いる場合は、「多分それは通知を送信します..」そしてような何か考えてみます。SendCommand

... 
while (stream read) 
{ 
    if (this is a notification) 
    { 
    then add it to the notification buffer and continue read 
    continue; 
    } 
    else (this is our command) 
    { ... read the response..} 
} 
関連する問題