2011-04-11 4 views
2

읽기 및 쓰기를 기다리는 동안 '선택'하는 방법이 있습니까? 또한 새 파일 설명자를 추가 할 수 있습니까? preferrably 한 스레드에서?C++ 비동기 프로그래밍

+0

당신은 단지 하나 개의 스레드를 가지고 있다면, 누가 새로운 파일 기술자를 추가? –

+0

@Oli : OP는'select' 호출을 취소하고'select' 호출이 있기 전에 해당 기술자를 추가하려고합니다. –

+1

@Andre : 단 하나의 스레드 만 있으면 * '선택'을 중단하고 싶을 때 * 사용할 수 있습니까? 외부 자극이 있습니까? –

답변

2

이제 (수신 연결을 허용 할 수있는 소켓 기반 서버 인) 시나리오가 무엇인지 알았으므로 청취 소켓에 대한 파일 설명자를 select의 목록에 추가 할 수 있다는 것을 알고 계셨습니까? 예 : http://www.lowtek.com/sockets/select.html.

(인용 함 예 :

fd_set socks; 

FD_ZERO(&socks); 

// Add listener socket 
listen(sock, n); 
FD_SET(&socks, sock); 

// Add existing socket connections 
for (i = 0; i < num_existing_connections; i++) 
{ 
    FD_SET(&socks, connection[i]); 
} 

// Will break if any of the existing connections are active, 
// or if a new connection appears. 
select(..., &socks, ...); 
+0

웹 사이트는 매우 도움이되었습니다. 감사! – Andrew

3

내 생각에, 당신은 같은 스레드에서 할 수 있지만 동시에 할 수 없습니다. 이와 같은 문제에서 필자는 보통 더미 루프백 소켓을 디스크립터 목록에 추가하고 FD_LIST에 새 소켓을 추가해야 할 때마다 더미 소켓에 바이트를 보내면 Select Loop가 손상됩니다. 그런 다음 FD_LIST를 업데이트하고 select를 사용하여 다시 시작할 수 있습니다.

+0

마지막 매개 변수를 사용하여'select' 호출에 타임 아웃을 추가 할 수도 있습니다. –

+0

물론 있습니다. 그러나이 경우 select에서 오랜 시간 간격을 사용한다면 새로운 소켓이 FD_LIST에 추가 될 때까지 기다려야합니다. select에서 매우 짧은 간격을 사용하거나 즉시 소켓을 추가 할 필요가없는 경우 interval 매개 변수를 사용하는 것이 좋습니다. – Tayyab

관련 문제