none
MSDNでのNetworkStream.EndReadの説明 RRS feed

  • 質問

  • 下記ページで
    http://msdn2.microsoft.com/ja-jp/library/system.net.sockets.networkstream.endread(VS.80).aspx

    NetworkStream.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);
    }

    2006年12月20日 9:54

回答


  • // ローカル変数だったものをグローバル変数に変更
    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);
    }

     

    最小限の修正だと、こんなところで動くかな? とは思いますがいかがでしょうか。

    これでも、あんまり良いサンプルとは言いがたい気はします。

    2006年12月24日 14:33

すべての返信


  • // ローカル変数だったものをグローバル変数に変更
    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);
    }

     

    最小限の修正だと、こんなところで動くかな? とは思いますがいかがでしょうか。

    これでも、あんまり良いサンプルとは言いがたい気はします。

    2006年12月24日 14:33
  • ありがとうございます。勉強になりました。

    やっぱり間違っていたのですね。

    C#のネットワークに関しての文献がただでさえ少ないのに

    MSDNで間違われると路頭に迷ってしまいます。

    すいません。愚痴ってしまいました。

    2006年12月25日 12:57