2011-12-17 15 views
0

ここでは、サーバーとクライアントがマシン上で動作していることについてのテロリズムの問​​題をトラブルシューティングしています。私はすべてのNETプロセスを知っていますが、コードを参照しているものがありません。私はこれに関連する何かを見つけることができませんでした。ビジュアルC#2008でTCPListener/TCPClientサーバー - クライアントデータの書き込み/読み取り

Iコード、私は2つの異なるプロジェクトで定期的れるtcpClient/TCPListenerを使用します。

Project1の(クライアント)

のProject2(サーバー)

私の問題は多分ありとてもシンプルです:

1->サーバーがデータ、イベントハンドラを受け取る方法について可能ですか?

while (true) 
{ 

if (NetworkStream.DataAvailable) 
    { 
     //stuff 
    } 

Thread.Sleep(200); 
} 

私は、サーバーからの着信データを制御するために、がらくたの方法としてこれを発生します は私の最初のサーバー・コードでは、私は、このループを作るために使用されます。 BUTサーバーは常にデータを受信する準備ができています。

私の質問:次のようなものがありますか? - >

AcceptTcpClient(); 

何か起こるまで待つハンドラが必要です。この場合、特定のソケットデータを受信します。

2->一般的なネットワーキングI/Oメソッド。

問題は(私はnoobです)複数のデータ書き込みを処理する方法です。 バイト配列で大量のデータを送信すると、さらにデータを送信すると送信が中断することがあります。すべてのデータが結合され、受信時にエラーが発生します。私は、複数の書き込みを処理して送受信する必要があります。

これは可能ですか?

+0

** 1)** 'NetworkStream.Read(buffer、...、...)'はブロッキング呼び出しです。その奇妙なwhileループは必要ありません。 ** 2)** 'データをもっと送ると送信が壊れることがあります。 'あなたは 'NetworkStream.Write(buffer、...、...)'を安全に使うことはできません。 –

答えて

1

サーバーがデータを受信する方法については、イベントハンドラは可能ですか?

コールバック型のサーバーコードを書きたい場合は、MSDNのAsynchronous Server Socket Exampleを探してください。

...さらなるデータを送信すると送信が中断することがあります。すべてのデータが結合され、受信時にエラーが発生します。

これはTCPの性質です。あなたが本当にブロックデータのを送信したい場合は、SCTPを使用しますが、彼らは「通常でないため、多くのファイアウォールは、SCTPパケットをドロップすることを認識することができ

   block oriented stream oriented 
reliable   SCTP    TCP 
unreliable   UDP    --- 

:標準化されたインターネット・プロトコルは、いくつかのカテゴリに分類され"開いているインターネット上で確実にSCTPパケットをルーティングできるかどうかはわかりません。

独自のヘッダーを使用して独自のコンテンツをデータブロックにラップすることも、他の「同期」メカニズムをシステムに追加することもできます。HTTPサーバを考えてみましょう:サーバーはCRLFCRLFシーケンスを見るまで、それはバッファに部分的に読み取ったデータを保持しなければならない

GET /index.html HTTP/1.1␍␊ 
Host: www.example.com␍␊ 
␍␊ 

:それはのようなentire requestを読み込むまで待たなければなりません。バイトは、一度に1つまたは複数のパケットに入ってくるかもしれません。クライアントが単一のストリームで複数の要求を送信している場合は、1つのパケットに12個の要求が含まれる可能性があります。

これを処理するだけです。

関連する問題