2009-11-06 2 views
2

select()를 사용하여 이미 완료 한 멀티 스레딩과 달리 여러 클라이언트를 처리하는 서버를 만들려고합니다. 그러나 select()는 아무 것도하지 않는 것 같습니다. 예를 들어 필요한 모든 시스템 호출이 있습니다. socket()은 listener라는 int로 반환됩니다. bind(), then listen(), 모든 문제를 반환하지 않는 적절한 오류 검사. 그것은 또한 잘 컴파일됩니다.C (Windows 7)에서 Select() 문제

FD_ZERO(&fileDescriptors); 
FD_ZERO(&tempSet); 
..... 
FD_SET(listener, &fileDescriptors); 
fdmax = listener; 
..... 
while(1){ 
    if(select(fdmax+1, &tempSet, NULL, NULL, &timeout) == -1){ 
      //error occured 
    } 
..... 
} 

클라이언트는 클라이언트 측에서 0을 돌려줍니다) (그러나 WSAGetLastError를 연결을 설정하지 못할. 그리고 서버는 절대로 timeout 때문에 0을 반환하는 것과는 별개로 select()를 전달하지 않습니다. 내 코드에서 문제를보기 위해 정말로 고심하고 있습니다.

답변

2

세트 fileDescriptorslistener을 추가하는 대신 tempSetselect (으)로 전달합니다.

당신의 의견에는 실제로 "tempSet을 fileDescriptors와 동일하게 설정"하는 코드가 있다고합니다. 일반적으로 을 수행 할 수 없습니다. fd_set의 내부 구조에 대해 알지 못하지만 완전히 복사해야하는 포인터가있을 수 있습니다.

FD_COPY이 없다는 것이 유감이지만 그것이 그 방법입니다. 매번 FD_ZEROFD_SET으로 세트를 만들어야합니다.

+0

죄송합니다. tempSet을 fileDescriptors와 같게 만들었습니다. – Rick

관련 문제