데이터를 전송했는지 확인하기 위해 내부적으로 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 자 장치로 시도 할 때만 나는 곤란을 겪습니다.
여기에 어떤 일이 벌어 질 수 있으리라 생각합니다.
StateObject를 조사 할 때 데이터 문자열을 수신하여 저장했으며 코드는 client.BeginReceive를 다시 호출하려고 시도합니다. ReceiveCallback을 다시 입력해야합니다. 다른 것이 없어도 혼란 스럽습니까? – CaffeineZombie
시간 제한을 지정하지 않으면 대기합니다. 기본 구현에 대해서는 확신 할 수 없습니다. –
메서드 사용 방법에 대한 설명서를 검토하는 것이 좋습니다. http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx –