0 개 이상의 소켓을 가질 수있는 fd 세트가 있다고 가정하십시오. 비어있는 fd 세트에서 select 연산을 호출하려고하면 -1이 fds의 수로 설정되어 오류를 의미합니다. 그래서이 문제를 극복하기 위해 무엇을 제안하겠습니까? 빈 경우 호출하지 말고 루프가 있으며 fd 세트는 0 개 이상의 소켓을 가질 수 있습니다. 이 문제에 대한 최선의 접근 방법은 무엇입니까? (우리는 C 프로그래밍 언어를 사용합니다)소켓 빈 fd 세트로 선택
답변
그건 맞지 않아요. 집합에있는 파일 설명자의 수를 0으로 지정할 수 있어야합니다. 사실, 이것은 초기에 타임 아웃 코드를 사용하는 것을 기억하며, 설명자가없는 select
을 사용하고 타임 아웃 값을 적절하게 설정했습니다.
-1이 반환되면 문제가 무엇인지 확인하려면 errno
을 확인해야합니다.
아 댓글에 따르면 WSAEINVAL
은 WinSock을 의미합니다. 그것은 당신의 문제를 설명합니다. 이 시간 제한 값이 유효하지 않거나 세 가지 설명 변수가 null 인 경우 WSAEINVAL
을 얻을 것이다
This page here 상태 :-) 우리 불행 넣어해야 끔찍한 짐승입니다. 나중에 FD_ZERO
이 "집합을 null 세트로 초기화합니다"라고 나와 있습니다. 마지막 스 니펫은 매개 변수가 여전히 NULL로 간주되는지 여부를 나타내며, 나는 알지 못합니다. 귀하의 타임 아웃이 괜찮다고 가정하면 (세트 중 하나에 FD가있는 경우 작동하므로) 아마도 그럴 것입니다.
버클리 소켓은 NULL FD 세트 (즉, NULL 포인터)와 빈 FD 세트 (FD가 설정되지 않은 유효한 포인터)를 구별합니다. WinSock은 특히 nfds
이 무시되므로 그다지 유용하지 않을 수 있습니다 버클리와의 호환성을 위해서만 포함되었습니다.
WinSock이 아마도 당신이하려는 일을하지 않을 것으로 예상됩니다 (비록 확실하지 않지만). 그것은 단지 여러분이 뭔가 잘못하고 있다고 가정하고 하나 이상의 FD 세트에있는 하나 이상의 소켓에 대해서만 select
을 사용해야합니다 (FD가없는 select
의 유일한 사용은 지연이고 Windows에는 많은 좋은 방법이 있기 때문에) 지연).
select 도움말을 읽어보십시오. WSAEINVAL은 "타임 아웃 값이 유효하지 않거나 세 개의 설명자 매개 변수가 모두 null"인 경우 반환됩니다. . 잘못된 타임 아웃 값을 전달하는 것은 명백합니다. 따라서 0 개의 설명자를 사용하려면 올바른 시간 초과 값을 제공하십시오.
Windows에서 select
함수는 nfds
인수를 완전히 무시합니다. 현재 이것을 테스트 할 수는 없지만 모든 세트가 NULL이 아니지만 비어 있으면 오류가 반환 될 수 있습니다.
이 문제를 해결하려면 전체 선택을 건너 뛰거나 항상 소켓에 소켓이 하나 이상 있는지 확인하기 위해 더미 소켓을 유지하십시오.
당신은 Windows에서 무시 무시한 nfds이지만, 내 인수가 NULL이 아닌 것입니다. 빈 .Windows는 NULL과 같은 위협이있는 것 같습니다. Bullsh .. – whoi
리눅스가 Windows보다 훨씬 잘 처리합니다! 정확히 같은 params를 가진 select() 호출은 리눅스에서 0을 반환합니다. 또한 @Hasturkun, Windows 및 Linux에서이를 테스트했습니다. Windows에서 -1 (SOCKET_ERROR)을 반환한다고 보증합니다. –
- 1. 멀티 스레드에서 소켓 fd
- 2. 다중 스레드 소켓 응용 프로그램에서 동일한 fd 번호 재사용 방지
- 3. 선택 소켓 프로그래밍
- 4. cl.exe에/FD 옵션이 무엇입니까
- 5. 선택 태그 기본 선택 빈 항목
- 6. 선택 상자 YUI 빈 2
- 7. jQuery로 테이블의 빈 행 선택
- 8. Django : 많은 필드에서 빈 선택
- 9. fd 중복 파이썬에서 자식 프로세스
- 10. Django - 선택 테이블을 외국 테이블의 쿼리 세트로 제한 하시겠습니까?
- 11. 입력 된 데이터 세트로 작업 할 때 하나의 행 선택
- 12. vb.net에서 데이터 세트로 데이터 전송
- 13. 오류 : 소켓 선택() 함수는 항상 0을 반환합니다 ..?
- 14. 데이터 세트로 작업하기
- 15. 레일 : 큰 세트로 작업하기
- 16. 비 블로킹 소켓
- 17. IE : 비어있는 빈 목록에서 디지털 인증서 선택
- 18. 빈 영역을 클릭하면 목록 상자 선택 취소
- 19. javax.print로 인쇄 할 때 빈/용지함 선택
- 20. Cobol fd 파일에서 MsSql 테이블 만들기
- 21. UNIX에서 fd 2를 임시로 비활성화하는 방법이 있습니까?
- 22. 파이썬 소켓 폴링 문제
- 23. 개미집 세트를 파일 세트로 바꾸기
- 24. Linq을 사용하여 세트로 목록 나누기
- 25. 큰 메일 세트로 Mailto 사용
- 26. JSON을 .NET 데이터 세트로 변환
- 27. 추가 세트를 다른 세트로 설정
- 28. 비 소켓 소켓 작업
- 29. Windows 소켓 소켓 성능
- 30. 자바 : 소켓 대 소켓
'nfds' 인수를 0으로 설정하여'select'를 호출합니까? 어떤 플랫폼을 사용하고 있습니까? – Hasturkun
우리의 삶을 좀 더 쉽게 만들기 위해 코드를 게시하고 싶을 수도 있습니다. Raymond Chen은 총기 심령 디버거 일지 모르지만 우리 중 일부는 단호한 증거로 작업하는 것을 선호합니다 .- – paxdiablo
@Hasturkun - 예 nfds는 0이고 창문에 있습니다. – whoi