2010-08-11 9 views
1

나는 다음과 같은 방법으로 TCP 소켓 사용 "차단"C#은 TCP 소켓 재산권 불일치는

m_socket = 새로운 소켓 (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp을); m_socket.ReceiveTimeout = 15;

일반적인 흐름은 무한 while 루프에서 m_socket.Receive를 실행하고 어떤 시점에서 소켓이 오랜 기간 동안 비어 있지만 닫고 싶지 않다는 것입니다. 대신 15 초마다 예외를 읽고 계속 시도하려고합니다.

처음에 소켓이 비게되면 예상대로 15 초 후에 제한 시간 소켓 예외가 발생합니다. 그렇다면 여전히 루프에 있기 때문에 m_socket.Receive가 다시 호출됩니다. 그러나 이번에는 비 블로킹 소켓 작업을 완료 할 수 없으므로 예외가 발생합니다 (예상하지 못한 것이기 때문에 다른 15 개를 차단한다고 가정 함). 초) 위의 한 줄 m_socket.Blocking 쿼리 할 때 TRUE 말한다.

흥미로운 점은 내가 m_socket.Blocking = true를 수행하면; m_socket.Receive 바로 전에 모든 것이 예상대로 실행됩니다 (시간 초과 예외는 15 초마다 발생합니다).

유일하게 가능한 설명은 시간 초과 예외가 수신 동작 또는 소켓 작동을 일반적으로 비 차단 방식으로 작동하도록 변경하고 그에 따라 "차단"속성을 변경하지 않는 것입니다.

+1

수신 루프 코드를 올리십시오. – James

답변

1

은 내가 밀리 초 단위로 지정 .NET 4.0

0

동일한 스레드에서 다른 winsock 함수 호출을 차단합니까? msdn에서

: 같은 전송, RECV, 가 선택, 윈속은 네트워크 이벤트 전에 대기해야 할 수도 있습니다, 기능 호출을 수락, 또는 연결 등의 차단 는 Winsock 호출을 수행

주 전화는 완료 할 수 있습니다. 이 상황에서 알림 대기가 수행되고 비동기 프로 시저 호출 (APC) 이 같은 스레드에서 예약되고 이로 인해 이 중단 될 수 있으며 이로 인해 지정되지 않은 결과가 생성됩니다. 은 Winsock 기능을 차단하지 않음 현재 스레드가 내부에서 대기 중이라는 것을 확신하지 않고 호출합니다. 다른 차단 Winsock 함수 call; 이렇게하면 예측할 수없는 동작이 발생합니다.