トップ回答者
MSDNでのNetworkStream.EndReadの説明

質問
-
下記ページで
http://msdn2.microsoft.com/ja-jp/library/system.net.sockets.networkstream.endread(VS.80).aspxNetworkStream.EndReadの使用例が掲載されていますが
この例のいったいどこで、メッセージを受信しているのでしょうか?myCompleteMessage =
String.Concat(myCompleteMessage, Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));ここでだとは思うのですが、
このコードだとmyCompleteMessageは空のままだと思うのですが、どうでしょうか?受信したメッセージを引き継いでいるところが見当たりません。
この例が正しい場合は、どこでメッセージを引き継いでいるのか教えてください。
また、間違っている場合は、どうすればただしいコードになるのか教えていただけるとうれしいです。public static void myReadCallBack(IAsyncResult ar ){
NetworkStream myNetworkStream = (NetworkStream)ar.AsyncState;
byte[] myReadBuffer = new byte[1024];
String myCompleteMessage = "";
int numberOfBytesRead;numberOfBytesRead = myNetworkStream.EndRead(ar);
myCompleteMessage =
String.Concat(myCompleteMessage, Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
// message received may be larger than buffer size so loop through until you have it all.
while(myNetworkStream.DataAvailable){
myNetworkStream.BeginRead(myReadBuffer, 0, myReadBuffer.Length,
new AsyncCallback(NetworkStream_ASync_Send_Receive.myReadCallBack),
myNetworkStream);}
// Print out the received message to the console.
Console.WriteLine("You received the following message : " +
myCompleteMessage);
}
回答
-
// ローカル変数だったものをグローバル変数に変更
static byte[] myReadBuffer = new byte[1024];public static void myReadCallBack(IAsyncResult ar ){
NetworkStream myNetworkStream = (NetworkStream)ar.AsyncState;
// 削除
//byte[] myReadBuffer = new byte[1024];
String myCompleteMessage = "";
int numberOfBytesRead;
numberOfBytesRead = myNetworkStream.EndRead(ar);
myCompleteMessage =
String.Concat(myCompleteMessage, Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
// white を if に変更
if (myNetworkStream.DataAvailable){
myNetworkStream.BeginRead(myReadBuffer, 0, myReadBuffer.Length,
new AsyncCallback(NetworkStream_ASync_Send_Receive.myReadCallBack),
myNetworkStream);
}
// Print out the received message to the console.
Console.WriteLine("You received the following message : " +
myCompleteMessage);
}
最小限の修正だと、こんなところで動くかな? とは思いますがいかがでしょうか。
これでも、あんまり良いサンプルとは言いがたい気はします。
すべての返信
-
// ローカル変数だったものをグローバル変数に変更
static byte[] myReadBuffer = new byte[1024];public static void myReadCallBack(IAsyncResult ar ){
NetworkStream myNetworkStream = (NetworkStream)ar.AsyncState;
// 削除
//byte[] myReadBuffer = new byte[1024];
String myCompleteMessage = "";
int numberOfBytesRead;
numberOfBytesRead = myNetworkStream.EndRead(ar);
myCompleteMessage =
String.Concat(myCompleteMessage, Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
// white を if に変更
if (myNetworkStream.DataAvailable){
myNetworkStream.BeginRead(myReadBuffer, 0, myReadBuffer.Length,
new AsyncCallback(NetworkStream_ASync_Send_Receive.myReadCallBack),
myNetworkStream);
}
// Print out the received message to the console.
Console.WriteLine("You received the following message : " +
myCompleteMessage);
}
最小限の修正だと、こんなところで動くかな? とは思いますがいかがでしょうか。
これでも、あんまり良いサンプルとは言いがたい気はします。