2011-11-10 1 views
4

Ok 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 필요하지만 심지어이 일 것입니다 있는지 확실하지 않습니다 : 이것은 내가 지금까지있는 것입니다. 나는이 점에서 약간 길을 잃었다! 여기서 어디로 가야합니까? 비동기 동작에 Begin* 메소드를 호출 할 때

+1

잘못된 트랙에 있습니다. Socket.BeginReceive()에 대한 MSDN Library 예제 코드를 사용하십시오. –

+0

비동기 버전을 사용해야하는 이유가 있습니까? 그냥'Read()'를 사용할 수 없습니까? – svick

+0

그게 효과가 있니? 궁극적으로 저는 이것을 끊임없이 실행하는 서비스를 원하지만 현재는 결과를보고 싶습니다. 또한, 한스 감사합니다. 나는 그것을 조사 할 것입니다. – JMK

답변

12

는 기본적으로 (특히 섹션은 "비동기 작업 종료"를 Asynchronous Programming Overview on MSDN 자세한 세부 내용) 대응 End* 문 호출이있을 필요가있다. 이 경우, Stream.EndRead을 해당 End* 메서드를 호출

1) :

는 일반적으로 하나 또는 두 가지 작업을 수행하는 방법/익명 메소드/람다 식을 전달하려면, 말했다. callback은 작업이 완료 될 때까지 호출되지 않기 때문에 호출 할 때이 호출이 차단되지 않습니다. 비동기 호출 중에 예외가 발생하면 End* 메서드가 호출 될 때이 예외가 throw됩니다.

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 class에있는 FromAsync method을 사용하면 훨씬 쉽게 처리 할 수 ​​있습니다.