- - PR -
非同期サーバの受信について
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-06-15 18:19
お世話になっております。
非同期のソケット通信で質問があります。 ◇現状 ・クライアントから4つのデータが送られてくるが、サーバ側では2つのデータしか受信 できていない模様。(たまに4つ受信できているようです。) ・クライアントから送信するデータとデータの間を1秒程度Waitさせるとサーバ側では正 常に4つ受信できます。 ・非同期サーバはMSDNに記載されているサンプルを見ながら作成しました。(BeginReceive で受信し、Callbackを呼び、Callback内で再度BeginReceiveを呼んでいます) ◇質問 ・サーバ側のどこかを排他すればよいのかなぁと思っているのですが、うまくいきません。 (正常に4つのデータを受信できていないです。) どこらあたりに排他制御をいれるべきなのでしょか? または、排他制御を入れるという考え自体が間違っているのでしょうか? 以下ソースの抜粋です。 --------------------- // BeginReceiveに呼ばれるCallback private void ReadCallback(IAsyncResult ar) { String content = String.Empty; stateObject state = (stateObject)ar.AsyncState; Socket handler = state.workSocket; try { RecvDataSize = handler.EndReceive(ar); if (RecvDataSize < 1) { //切断時の処理} //ここでの表示回数で正常にデータが4つ受信されたかを確認しています。 Console.WriteLine("***************************"); handler.BeginReceive(state.buffer, 0, stateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); } catch (SocketException ee){} } -------------- なにか、アドバイス、ヒント等頂ければ幸いです。 | ||||||||||||
|
投稿日時: 2006-06-15 18:44
「4つ」受信と言うのがよく分かりませんが、なぜ受信したデータそのもので確認しないのでしょうか? 単に複数回 Send したのを纏めて一度に Receive してるだけという可能性は?
何らかの例外が発生していたとしてもこれでは分からないですが、実は例外が発生していませんか? | ||||||||||||
|
投稿日時: 2006-06-15 19:11
返信ありがとうございます。
Console.Writeline(Encoding.ASCII.GetString(state.buff)) として、受信してみたのですが、1つ目のデータを受信後に次にすすまなかったので、 回数を正しく受信しているのかなと思って上記のようなに記述してみました。。。 (最初のデータは出力ウィンドウにでたのですが、それは期待していたデータでした。)
受信サイズを確認したところ、受信サイズはそれぞれ期待した値でした。
すみません。そこは登録するときに省きました。。。例外は発生していませんでした。 記述がわかりにくい箇所があり申し訳ないです。。。 | ||||||||||||
|
投稿日時: 2006-06-17 01:56
内容が完全に読み取れていないので、確証がありませんが、コードから見るとTCP/IPでサーバー・クライアント間の通信を行っていますよね。
やはり、4つのパケットという表現が気になります。送信したデータの中身は純粋のASCIIコードですか?制御コード見たいなものがありませんか? クライアント側でWaitせずに連続送信する場合、二つデータをひとつのパケットで受信することが十分ありうるので。 後、受信専用ThreadでSocket.Recv()でブロックモードで受信させ、この場合の結果と比較するとかの検証方法もあります。 | ||||||||||||
|
投稿日時: 2006-06-19 09:00
返信ありがとうございます。
解決しました。 Hongliangさん、Bobさんの言われるように単にデータがくっついて送信されて いました。 ヘッダーに受信バイト数があるので、それを元にSocketFlags.Peekで読み込め ば問題なく受信できるようになりました。 初歩的な質問で申し訳ありませんでした。 ありがとうございます。
Encoding.ASCII.GetByteを使っているので純粋にASCIIコードだと思います。
ご指摘とおりでした。。。2つのデータがひとつのパケットで来ていました。
アドバイスありがとうございます。 |
1