2017-12-14 18 views
0

C에서 여러 클라이언트가있는 서버로 놀고 있었는데 한 가지만 나타났습니다. 클라이언트가 서버에서 연결을 끊을 때마다 (서버가 클라이언트의 파일 설명자에서 단순히 닫기를 호출 할 때) 선택 호출 (select를 사용하여 여러 클라이언트의 메시지를 처리 ​​함)에서 서버의 소켓을 읽을 준비가 된 것으로 설정하고 호출의 반환 값은 0입니다. select는 서버 소켓에서 0을 계속 반환하기 때문에이 사실을 무시하면 서버가 차단됩니다 다른 소켓을 기다리는 대신 준비 상태로 설정하십시오. 누군가 연결이 끊어진 후 서버가 새로운 연결을 수락하기 전에 서버 소켓을 사용하여 수행 할 추가 정리가 있습니까?클라이언트가 연결을 끊을 때 서버 선택 소켓을 선택하여 호출합니다.

답변

0

서버가 recv()에서 0 또는 -1이되면 해당 소켓에서 close를 호출해야하며 select()으로 전달되는 읽기 및 쓰기 fdsets에서이 소켓을 제거해야합니다. 그렇지 않으면 select()가 오류를 반환합니다. 읽기/쓰기 fdset에 나쁜 fd가 있습니다.

+0

대단히 감사합니다! 소켓을 fdsets에 추가 할 때 잘못된 플래그를 확인하고있는 것으로 나타났습니다. – user1435820