- PR -

非同期サーバの受信について

1
投稿者投稿内容
ぐすん
会議室デビュー日: 2006/04/25
投稿数: 9
投稿日時: 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){}
}
--------------

なにか、アドバイス、ヒント等頂ければ幸いです。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-06-15 18:44
引用:

//ここでの表示回数で正常にデータが4つ受信されたかを確認しています。
Console.WriteLine("***************************");


「4つ」受信と言うのがよく分かりませんが、なぜ受信したデータそのもので確認しないのでしょうか?
単に複数回 Send したのを纏めて一度に Receive してるだけという可能性は?

引用:

catch (SocketException ee){}


何らかの例外が発生していたとしてもこれでは分からないですが、実は例外が発生していませんか?
ぐすん
会議室デビュー日: 2006/04/25
投稿数: 9
投稿日時: 2006-06-15 19:11
返信ありがとうございます。

引用:

「4つ」受信と言うのがよく分かりませんが、なぜ受信したデータそのもので確認しないのでしょうか?


Console.Writeline(Encoding.ASCII.GetString(state.buff))
として、受信してみたのですが、1つ目のデータを受信後に次にすすまなかったので、
回数を正しく受信しているのかなと思って上記のようなに記述してみました。。。
(最初のデータは出力ウィンドウにでたのですが、それは期待していたデータでした。)

引用:

単に複数回 Send したのを纏めて一度に Receive してるだけという可能性は?


受信サイズを確認したところ、受信サイズはそれぞれ期待した値でした。

引用:

何らかの例外が発生していたとしてもこれでは分からないですが、実は例外が発生していませんか?


すみません。そこは登録するときに省きました。。。例外は発生していませんでした。

記述がわかりにくい箇所があり申し訳ないです。。。
Bob
常連さん
会議室デビュー日: 2006/03/23
投稿数: 31
投稿日時: 2006-06-17 01:56
内容が完全に読み取れていないので、確証がありませんが、コードから見るとTCP/IPでサーバー・クライアント間の通信を行っていますよね。

やはり、4つのパケットという表現が気になります。送信したデータの中身は純粋のASCIIコードですか?制御コード見たいなものがありませんか?

クライアント側でWaitせずに連続送信する場合、二つデータをひとつのパケットで受信することが十分ありうるので。

後、受信専用ThreadでSocket.Recv()でブロックモードで受信させ、この場合の結果と比較するとかの検証方法もあります。
ぐすん
会議室デビュー日: 2006/04/25
投稿数: 9
投稿日時: 2006-06-19 09:00
返信ありがとうございます。

解決しました。
Hongliangさん、Bobさんの言われるように単にデータがくっついて送信されて
いました。
ヘッダーに受信バイト数があるので、それを元にSocketFlags.Peekで読み込め
ば問題なく受信できるようになりました。

初歩的な質問で申し訳ありませんでした。
ありがとうございます。

引用:

やはり、4つのパケットという表現が気になります。送信したデータの中身は純粋のASCIIコードですか?制御コード見たいなものがありませんか?


Encoding.ASCII.GetByteを使っているので純粋にASCIIコードだと思います。

引用:

クライアント側でWaitせずに連続送信する場合、二つデータをひとつのパケットで受信することが十分ありうるので。


ご指摘とおりでした。。。2つのデータがひとつのパケットで来ていました。

引用:

後、受信専用ThreadでSocket.Recv()でブロックモードで受信させ、この場合の結果と比較するとかの検証方法もあります。


アドバイスありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)