2009-04-21 4 views
0

.NET의 소켓을 사용하여 async IO에 BeginReceive() 및 EndReceive() 메서드를 사용하고 있습니다. 클라이언트는 연속적인 데이터 패킷을 보내고 EndReceive() 호출은 읽은 바이트 수를 반환합니다.데이터를 사용할 수 없을 때 Socket.EndReceive() 블로킹을 피하는 방법

문제는 클라이언트가 데이터 패킷을 보내고 있지만 데이터 길이가 0입니다. WireShark의 트래픽을 분석하여이를 발견했습니다. 데이터의 길이가 0 일 때 EndReceive() 호출은 블록 만 차단합니다.

실제로 EndReceive()를 차단하지 않고 영점 길이 데이터를 식별하는 방법이 있습니까?

또한 ReceiveTimeout 속성이 비동기 메서드에서 작동하지 않는 것 같습니다.

샘플 소스 코드 :하지 패킷 단위의 데이터의 연속 스트림으로 패킷와

// This method runs on a separate thread 
private void ProcessRequest() 
{ 
    BeginReceive(OnClientReceive); 

    // Do some work here in a loop 
} 

// Callback method 
private void OnClientReceive(IAsyncResult result) 
{ 
    int receivedCount = socket.EndReceive(result); // this one blocks 

    // Do some work here 

    // Again start listening for data 
    BeginReceive(OnClientReceive); 
} 
+0

아지즈가 귀하의 질문에 답변했다고 생각하십니까? 클라이언트가 길이가 0 인 데이터를 보내는 경우에도 EndRecieve가 트리거되고 완료되어야합니다. 클라이언트가 보내기를 완료하기 전에 소켓을 닫으면 소켓 오류가 발생할 때 EndRecieve가 예외를 throw해야합니다. 나는 뭔가 다른 것이 여기에서 일어나고 있다고 생각한다. 나는 클라이언트가 절대 보내지 않기 때문에 그것의 차단을 생각한다. 클라이언트가 기다리고있는 소켓과 동일한 소켓을 사용하고 있다고 긍정적입니까? – Jess

+0

클라이언트가 0 데이터 전송을 완료하더라도 메시지 헤더를 보내야하고 EndRecieve가이를 받아 들여 0 바이트를 반환해야합니다. – Jess

+0

클라이언트 코드를 제어 할 수 있습니까? 데이터가 null 인 경우를 잡아서 보낼 수 없습니까? 이 방법으로 문제가 해결 될 수는 있지만 다시 생각하고 있습니다. – Jess

답변

0

소켓 .NET에서 다룬다. 따라서 EndReceive은 데이터를 사용할 수있을 때까지 또는 연결이 종료 될 때까지 차단됩니다.

는 패킷 단위로 수신 된 데이터를 캡처 할 경우

, 나는

+0

그게 내가 (WinpCap WireShark와 함께) 사용하고 있지만 문제는 패킷을 캡처하지 않습니다. EndReceive() 블록 때문에 내 스레드가 차단됩니다. 나는이 차단에서 벗어나고 싶다. – A9S6

+0

정확하게 이해하는지 잘 모르겠습니다. StartReceive()의 콜백에서 EndReceive()를 사용하고 있습니까? 그래서 EndReceive()는 읽을 데이터가있을 때까지 기다립니다. 데이터가 있는지 여부에 관계없이 실행하려는 코드가 있으면 콜백에 넣으면 안됩니다. 당신이 무엇을 잡으려고하는지 설명해 주시겠습니까? – Aziz

+0

예, EndReceive()에서 데이터를 가져온 후 실행되는 코드가 있습니다. 그러나 EndReceive()가 차단되면 콜백 메서드에서 데이터가 처리되지 않으므로 예외가 발생하지 않습니다. 그냥 기다리고 있습니다. 또한 ReceiveTimeout이 EndReceive()와 작동하지 않는다고 생각합니다. 이 EndReceive() 반환하고 콜백 스레드 (심지어 0을 반환하는 경우에도) 차단하지 않습니다. – A9S6

1

내가 socket.Available

  1. if socket.Available > 0 과정의 모든 코드를 확인할 것입니다 당신이 WinPcap 라이브러리 같은 것을 사용할 필요가 있다고 생각 콜백 "OnClientReceive"
  2. if socket.Available = 0 일부에 불과 "// 여기에 몇 가지 작업을 수행"
  3. 충돌
  4. 0123을 피하기 위해 몇 가지 잠금을 넣어 처리해야
관련 문제