C# で非同期ソケットを作成しようとしています。私は多くの msdn 記事を読んで、次の 2 つの例を見つけました: server、client。
これを使用して独自の非同期ソケットを実装するサンプル コードを理解しました。この例では、サーバーはチェックを行っ<EOF>
てストリームの終わりを判断し、応答を送信します。ストリームが終了したときに特別なリテラルをチェックせずに知りたいです。私の考えは、再帰的にチェック(bytesRead > 0)
して呼び出すことでした。handler.BeginReceive()
以下を参照してください。
オリジナル
if (bytesRead > 0) {
// There might be more data, so store the data received so far.
state.sb.Append(Encoding.ASCII.GetString(
state.buffer,0,bytesRead));
// Check for end-of-file tag. If it is not there, read
// more data.
content = state.sb.ToString();
if (content.IndexOf("<EOF>") > -1) {
// All the data has been read from the
// client. Display it on the console.
Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
content.Length, content );
// Echo the data back to the client.
Send(handler, content);
} else {
// Not all data received. Get more.
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
}
}
私の考え
if (received > 0)
{
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, received));
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
}
else
Send(handler, state.sb.ToString());
元のパーツを自分のパーツに置き換えると、プログラムの実行が停止します。EndSend()
クライアントがin で実行し、 inの後にSendCallback()
スレッドをブロックすると思います。どうすればこれを渡すことができますか?ストリームの終了を決定するトークンを使用する必要がありますか?receiveDone.WaitOne()
StartClient()
他に良いサンプルコードはありますか? たった今見つけた二人。
(証拠。サーバーはオンライン クライアントを受信し、このバッファーから循環バッファーに入れ、マルチスレッドでレコードを読み取って処理する必要があります。)
編集
私がフォリングを使用する場合:
if (receive > 0)
state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, receive));
if (receive == StateObject.BufferSize)
state.listener.BeginReceive(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallback), state);
else
Send(state.listener, state.sb.ToString());
すべてが正常に機能していると思います。大丈夫ですか?それとも何かが恋しいですか?
2つのifを組み合わせると、再び機能しなくなります。なんで?
if(receive > 0 || receive == StateObject.BufferSize)
->if(receive > 0) // Not working.