2011-04-18 7 views
0

나는 WM6 C#에서 비 블로킹 소켓을 만들기 위해 노력하고 있지만 나는 다음과 같은 컴파일러 오류가 계속 :C# 컴팩트 프레임 워크 비 블로킹 소켓을 만드는 방법

"동기 호출 비 블로킹 소켓에 지원되지 않습니다 Blocking = true로 설정하거나 비동기 메서드를 사용하십시오. "

그러나 BeginReceive() 비동기 메서드를 사용하면 EndReceive()가 차단됩니다. BeginSend() 및 EndSend()와 동일합니다. 소형 프레임 워크 내에서 비 ​​차단 소켓은 어떻게합니까?

여기 내 코드가 있습니다. bytesRecv 및 bytesSent 변수를 반환하기 때문에 AsyncCallback 메서드를 사용하지 않습니다.

private void asyncReceive(byte[] recvBytes, int offset, int size, SocketFlags sf) 
    { 
     IAsyncResult asyncResult = null; 
     int recvBytes = 0; 

     try 
     { 
      asyncResult = _socket.BeginSend(sendBytes, offset, size, sf, null, null); 
      recvBytes = _socket.EndSend(asyncResult); // <-- This blocks even with _socket.Blocking = false; 
     } 
     catch (SocketException) 
     { 
      //Check SocketException.ErrorCode... 
     } 

     return recvBytes; 
    } 

답변

2

요점을 놓치고있는 것 같습니다. 의도 한대로 동작하는 것입니다. .NET에서 비동기 프로그래밍을 읽는 것이 좋습니다 (많은 리소스 - 아마도 here 시작). BeginXXX로 논 블로킹 소켓 읽기/쓰기를하면 보내기/받기를 시작한 다음 다른 작업을 수행하고 완료되면 (AsyncCallback을 통해) 커널에서 알립니다.이 시점에서 해당 EndXXX 메서드를 호출합니다 결과를 얻으려면. 작업이 완료되기 전에 BeginXXX 호출 바로 다음에 EndXXX를 호출하면 완료 될 때까지 차단하도록 설계되었습니다.

비 차단 동작을 얻으려면 콜백을 올바르게 처리하기 위해 코드를 약간 분해해야합니다 (예 : 결과를 UI로 마샬링). 기본 커널 비트가 실제로 수행 할 때까지 얼마나 많은 바이트가 보내고 받았는지에 대한 답을 얻을 수 없습니다.

+0

[여기] (http://msdn.microsoft.com/en-us/vstudio/gg316360)에서 이와 같은 코드를 작성하고 원하는 동작을 얻을 수있는 새로운 기능이 있지만 의심 스럽습니다. CF가 꽤 많이 보였기 때문에 .NET Compact Framework에 백 포트 될 것입니다. – nitzmahone

+0

Matt 's correct : 콜백으로 Begin/End를 사용하기 만하면됩니다. 소켓을 다룰 때, "blocking/nonblocking"은 "synchronous/asynchronous"와는 다른 의미가 있습니다. 관리 코드에서 * nonblocking * 소켓을 사용하려면 폴링 루프를 설정해야합니다. 소켓을 사용하는 가장 좋은 방법은 * 비동기 블로킹 * 모델 (작업 자체가 블로킹되어 있지만 코드 완성이 비동기 적으로 통보되어 코드가 실제로 차단되지 않음)입니다. –

관련 문제