2012-03-13 3 views
4

차단을 사용하는 경우 시간 제한을 수락 수 있습니까? setsockopt를 통해 recv 및 함수를 보낼 수있는 것처럼 말입니다.Winsock에서 시간 제한을 허용합니다.

보이지 않는 것처럼 보이지만 확실하게하고 싶습니다.

+1

가능한 경우 http://stackoverflow.com/questions/4181784/how-to-set-socket-timeout-in-c-when-making-multiple-connections –

+0

@Adriano 아니, 그 질문은 클라이언트 측에 관한 것입니다. , * accept * 함수는 서버 측에서만 사용됩니다. 그들은 * accept * 함수를 말하는 것이 아닙니다. – Alecs

+0

Windows가 아니라면 스스로 제한 시간을 관리해야합니다 (어떤 식 으로든 스레드 폴링) –

답변

7

선택 기능을 시간 초과와 함께 사용할 수 있습니다. select가 비 블로킹 소켓과 함께 가장 일반적으로 사용되지만 블로킹 소켓을 전달하지 못하게하는 것은 읽지 않았습니다. select 함수가 시간 초과되면 accept timeout과 동일한 동작을합니다. MSDN

"매개 변수 readfds에서

는 가독성을 위해 검사 할 수있는 소켓을 식별합니다. 소켓이 청취 상태에서 현재의 경우는 같은 읽을 표시됩니다 들어오는 연결 요청이 수신 된 경우 accept는을 차단하지 않고 완료하는 것이 보장됩니다. 다른 소켓의 경우 읽기 가능은 recv, WSARecv, WSARecvFrom 또는 recvfrom에 대한 호출이 차단되지 않도록 보장하기 위해 대기중인 데이터를 읽을 수 있음을 의미합니다.

예상되는 동작을 제공해야합니다.

+0

아니요, select는 소켓 또는 accept 함수의 동작을 변경하지 않고 여전히 동일하게 유지되며 시간 제한없이 스틸 블록을 허용하지만, 나는 그것을 확인했다. – Alecs

+1

요점은 accept를 먼저 호출해서는 안되며, select를 호출하면 readfds를 청취 소켓으로 채 웁니다. select가 반환되면 소켓이 읽기 가능으로 표시되고 accept를 호출하면 성공합니다. 들어오는 연결 요청이 없으면 select가 시간 초과됩니다. – Jay

+0

오, 그래,이 작품은 내가 원했던대로 고마워! 그러나 [여기] (http://tangentsoft.net/wskfaq/articles/io-strategies.html) 선택 전화는 피해야한다고 말했습니까? – Alecs

0

청취 소켓을 닫으려면 다른 스레드를 준비하는 것이 매우 쉽습니다. 자동 재설정 이벤트를 작성하고 accept()가 리턴 할 때마다 신호를 보냅니다. 시간 제한 간격이있는 루프에서 WaitForSingleObject()를 사용하여 이벤트를 대기하는 함수를 작성하십시오. WFSO가 WAIT_OBJECT_0이 아닌 것으로 리턴하면 수신 대기 소켓을 닫고 종료하십시오. accept() 루프를 입력하기 직전에 함수를 호출하는 스레드를 작성하십시오.

또 다른 가능성은 acceptEx()를 사용하고 OVERLAPPED 구조체의 hEvent로 전달 된 이벤트에 대해 WFSO() 시간 초과를 기다리는 것입니다. 시간 초과가 발생하면 CancelIo()를 사용하여 대기열에있는 acceptEx() 완료를 네트워크 IO 시스템에서 제거하십시오.

관련 문제