.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 인 데이터를 보내는 경우에도 EndRecieve가 트리거되고 완료되어야합니다. 클라이언트가 보내기를 완료하기 전에 소켓을 닫으면 소켓 오류가 발생할 때 EndRecieve가 예외를 throw해야합니다. 나는 뭔가 다른 것이 여기에서 일어나고 있다고 생각한다. 나는 클라이언트가 절대 보내지 않기 때문에 그것의 차단을 생각한다. 클라이언트가 기다리고있는 소켓과 동일한 소켓을 사용하고 있다고 긍정적입니까? – Jess
클라이언트가 0 데이터 전송을 완료하더라도 메시지 헤더를 보내야하고 EndRecieve가이를 받아 들여 0 바이트를 반환해야합니다. – Jess
클라이언트 코드를 제어 할 수 있습니까? 데이터가 null 인 경우를 잡아서 보낼 수 없습니까? 이 방법으로 문제가 해결 될 수는 있지만 다시 생각하고 있습니다. – Jess