2011-11-10 5 views
4

いいえSocketに接続し、System.Net.Sockets.NetworkStreamクラスを使用してネットワークストリームを読みたいと思います。これは私がこれまで持っているものです。ネットワークストリームからBeginReadを呼び出す

NetworkStream myNetworkStream; 
Socket socket; 

socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, 
    ProtocolType.IPv4); 
socket.Connect(IPAddress.Parse("8.8.8.8"), 8888); 

myNetworkStream = new NetworkStream(socket); 

byte[] buffer = new byte[1024]; 
int offset = 0; 
int count = 1024; 

myNetworkStream.BeginRead(buffer, offset, count, ??, ??); 

今、私は私のBeginRead方法を完了するために、AsyncCallbackObject stateを必要とするが、私はこれが仕事に行くされている場合でも、わかりません。私はこの時点で少し失われています!ここからどこに行く必要がありますか?

+1

あなたは間違っています。 Socket.BeginReceive()のMSDN Libraryサンプルコードを使用します。 –

+0

非同期バージョンを使用する理由はありますか?あなたは 'Read()'を使うことはできませんか? – svick

+0

それは動作しますか?最終的に私はこれを常時稼働するサービスにしたいと思いますが、今はいくつかの結果を見たいだけです。また、ハンスに感謝します。私はそれをチェックします。 – JMK

答えて

12

あなたは非同期操作にBegin*メソッドを呼び出すときに、基本的に、対応するEnd*声明(より詳細な情報については、Asynchronous Programming Overview on MSDNを参照してください、「非同期操作の終了」と題した特別セクション)への呼び出しが必要です。 、この場合には、Stream.EndRead対応End*メソッドを呼び出し

1):

あなたは、一般的に1つのまたは2つのことを行います方法/匿名メソッド/ラムダ式を渡したい、と述べたこと。操作が完了するまで callbackが呼び出されないため、この呼び出しはブロックされません(非同期呼び出し中に例外が発生した場合は、 End*メソッドが呼び出されたときにこの例外がスローされます)。

2)おそらく新しい非同期呼び出しを開始します。しかし

// Declare the callback. Need to do that so that 
// the closure captures it. 
AsyncCallback callback = null; 

// Assign the callback. 
callback = ar => { 
    // Call EndRead. 
    int bytesRead = myNetworkStream.EndRead(ar); 

    // Process the bytes here. 


    // Determine if you want to read again. If not, return. 
    if (!notMoreToRead) return; 

    // Read again. This callback will be called again. 
    myNetworkStream.BeginRead(buffer, offset, count, callback, null); 
}; 

// Trigger the initial read. 
myNetworkStream.BeginRead(buffer, offset, count, callback, null); 

:この場合、それはあなたがより多くのデータを読みたいと思うでしょう仮定していますので、あなたは#2をしたいと仮定すると、Stream.BeginRead

に新しいコールを開始する必要があり、次の操作を行うことができます.NET 4.0を使用している場合、これはTaskFactory classFromAsync methodを使用する方がずっと簡単です。

関連する問題