1

このSocket.BeginSend()メソッドのシグネチャを見ると、次のようになります。

public IAsyncResult BeginSend(
    byte[] buffer,
    int offset,
    int size,
    SocketFlags socketFlags,
    AsyncCallback callback,
    Object state
)

bufferstateパラメータの違いがわかりません。カスタム クラス (Socket フィールドとその他のカスタム プロパティを含む) があります。

バイト配列を作成し、1 番目のパラメーター (バッファー内) で送信するか、6 番目のパラメーター (状態オブジェクト) で送信することにより、反対側に送信する最良の方法は何でしょうか?

それらを状態で送信すると、バッファは何に使用されますか? そして、それらをバッファに送信すると、状態は StateObject クラスにのみ使用されますか?

もう1つ、反対側に送信したい多くのカスタム(および異なる)クラスがあり、いくつかのパラメーターで「分割」するコードを実行する必要があります。どうやってするか?

4

2 に答える 2

1

@マーカスの答えは、質問の最初の部分に適しています。EndXXX状態オブジェクトはネットワーク経由で送信されません。これは、呼び出し元のオブジェクトに呼び出しを関連付けることができるようにするためだけですBeginXXX

2 番目の部分:

反対側に送信したい多くのカスタム (および異なる) クラスがあり、いくつかのパラメーターで「分割」するコードを実行する必要があります。どうやってするか?

これにはプロトコルが必要です。最も簡単な方法は、擬似的に次のようになります。

  1. 送信するオブジェクト O をサイズ S のバイト配列 B にシリアル化します
  2. intたとえば、S をバイト配列 ( ) として送信しますBitConverter.GetBytes()
  3. 受信側は最初の 4 バイトを受信して​​ を再構築するintため、S が認識されます。
  4. B のすべてのバイトを送信する
  5. 受信者は S バイトを受信するまで読み取りを続けるため、B を再構築してオブジェクト O を逆シリアル化できます。
于 2012-10-25T10:03:22.610 に答える
1

.NET では、BeginXxx/ EndXxxasync パターンは通常次のようになります。

IAsyncResult BeginXxx(..., AsyncCallback callback, Object state);
SomeResult EndXxx(IAsyncResult result);

状態オブジェクトは、プロパティEndXxxを呼び出してコールバックまたはメソッドで状態を取得できるように渡す任意のオブジェクトです。IAsyncResult.AsyncState

state パラメーターは、このパターンをサポートするためにのみ使用され、ソケットを介して何かを送信するためには使用されません。バッファ内のデータのみがソケット経由で送信されます。

あなたの質問の最後の部分はよくわかりませんが、ソケットを介してオブジェクトを送信する場合は、オブジェクトを にbyte[]シリアル化し、ソケットを介して送信し、反対側で逆シリアル化できます。それがあなたの求めているものでない場合は、私に知らせてください。

于 2012-10-25T08:42:40.370 に答える