2010-07-21 4 views
1

데이터를 전송했는지 확인하기 위해 내부적으로 socket.BeginReceive을 호출해야하는 비동기 클라이언트 메소드에서 수신 콜백을 받았습니다. 이와비동기 Socket.BeginReceive 내부 호출 미스터리

private void ReceiveCallback(IAsyncResult ar) 
    { 
     try 
     { 
      StateObject state = (StateObject)ar.AsyncState; 
      Socket client = state.workSocket; 
      int bytesRead = client.EndReceive(ar); 

      if (bytesRead > 0) 
      { 
       state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); 
       client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
        new AsyncCallback(ReceiveCallback), state); 
      } 
      else 
      { 
       if (state.sb.Length > 1) 
       { 
        response = state.sb.ToString(); 
       } 
       File.AppendAllText(DataDisplay.Properties.Settings.Default.rawDataLog, response + "\r\n"); 
       receiveDone.Set(); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 

문제는 코드가 client.BeginReceive 호출에 도달하면, 아무 변화가 없다는 것입니다 다음과 같이 코드입니다. 나는 그것이 모호하게 들린다는 것을 알고 있습니다, 그래서 설명하려고 노력하겠습니다. 나는 코드 전체에 중단 점을 설정하여 어디로 갈 수 있는지를 알 수 없었습니다. else 사례를 시도해 보았습니다. ReceiveCallback의 시작 부분 인 receivedone.Set()이 주 코드로 돌아오고 catch 문 등은 사용할 수 없습니다.

가장 혼란스러운 부분은 내가 쓴 테스트 서버로 실행할 때 기대했던대로 작동한다는 것입니다. 이 코드는 본질적으로 비동기 소켓의 MSDN 예제에서 나온 것입니다. 제 3 자 장치로 시도 할 때만 나는 곤란을 겪습니다.

여기에 어떤 일이 벌어 질 수 있으리라 생각합니다.

답변

1

디버깅하는 동안 실제 수신되는 것이 없으므로 본질적으로 수신 스레드에서 영구적으로 대기 할 수 있습니까? BeginReceiveThreadPool 스레드를 사용하며 게시하는 메소드를 콜백합니다. 그 사람이 다시 전화하지 않으면 내 첫 인상은 아무것도받지 못한다는 것입니다.

+0

StateObject를 조사 할 때 데이터 문자열을 수신하여 저장했으며 코드는 client.BeginReceive를 다시 호출하려고 시도합니다. ReceiveCallback을 다시 입력해야합니다. 다른 것이 없어도 혼란 스럽습니까? – CaffeineZombie

+0

시간 제한을 지정하지 않으면 대기합니다. 기본 구현에 대해서는 확신 할 수 없습니다. –

+0

메서드 사용 방법에 대한 설명서를 검토하는 것이 좋습니다. http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx –