2010-01-25 4 views
0

C++에서 Winsock 2를 사용하고 클라이언트 연결에서 내 서버 읽기를 중지하는 방법을 궁금해합니다. 읽기 스레드가 recv()에 차단되고 어떻게 중단할지 전혀 모릅니다. 이를 수행하는 한 가지 방법은 select()의 비 블로킹 소켓을 사용하는 것입니다. 그러나이 스레드는 새로운 select()을 확인하기 전에 대기해야합니다.[C++ winsock2.0] winsock 차단 호출을 중단하는 방법은 무엇입니까?

소켓 읽기를 중지하는 적절한 방법은 무엇입니까?

답변

2

차단 호출을 recv()으로 중단하려면 closesocket()으로 또 다른 스레드에서 소켓을 닫을 수 있습니다. 약간 추한 경우에도 작동해야합니다.

shutdown() 소켓을 사용해 볼 수도 있습니다 (필자는 그것을 테스트하지 않았습니다).

3

프로그램에 소켓 I/O로 작업하는 것 외에 다른 작업이있는 경우 먼저 차단하지 않아야합니다.

스레드가 이어야한다고 말하면 기다려야하지만 이는 프로그램의 현재 디자인을 반영한 것입니다. 어떤 형태의 non-blocking 소켓에서도 작동하도록 다시 디자인해야합니다. 모든 네트워킹 문제는 논 블로킹 소켓을 사용하여 해결할 수 있습니다.

Winsock을 사용하고 있으므로 여기에 many alternatives이 있으며 select()이 아닙니다. select()은 응용 프로그램이 많은 플랫폼에서 실행되어야하고 모든 현대 플랫폼에서 사용 가능한 상위 (그러나 서로 호환되지 않는) 대안을 사용할 수없는 경우에만 적합한 선택입니다.

-1

답변을 읽은 후에 아이디어가 있습니다. 그것은 setsockopt()로 끝납니다. recv()에 대한 시간 제한을 설정하는 데 사용합니다. 시간 초과 인 경우 시스템에서 여전히이 소켓에서 읽는지 여부를 확인합니다.

이렇게하면 읽기 스레드가 recv()에서 들어오는 패킷을 기다리는 데 대부분의 시간을 소비하게됩니다.

고맙습니다. Voteforpedro

관련 문제