마지막으로, 구조체 시간, 시간 시간, 끝에 이 작업을 통해 select() 이 집합을 확인하는 시간을 알 수 있습니다. 시간 시간 이후에 또는 이벤트가 발생하면 첫 번째 중 첫 번째 중 첫 번째로 돌아갑니다. 구조형 타임벌에는 두 개의 필드가 있습니다: tv_sec는 tv_usec, 마이크로초(1,000,000마이크로초)를 추가하는 초 수입니다. 다음 프로그램 예제는 간단한 다중 사용자 채팅 서버처럼 작동합니다. 한 창에서 실행을 시작한 다음 다른 창에서 텔넷(“텔넷 호스트 이름 2020”)으로 통신합니다. 다음 프로그램 예제는 이 장에서 만든 모든 서버/수신기 프로그램을 테스트하는 데 사용되는 클라이언트입니다. 이 프로그램은 TCP 프로토콜을 사용합니다. 소켓의 가장 좋은 설명과 내가 발견 한 선택, 감사합니다! 다음 프로그램 예제는 소켓이 TCP를 사용하여 서버를 클라이언트에 연결하고 클라이언트를 서버에 연결하는 연결 지향입니다. 이 예제에서는 보다 완전한 소켓의 API 사용을 제공합니다. 코드에는 마스터 및 read_fds의 두 가지 파일 설명자 집합이 있습니다. 첫 번째 마스터는 현재 연결된 모든 소켓 설명자뿐만 아니라 새 연결을 수신 대기중인 소켓 설명자도 보유합니다. 첫 번째 매개 변수인 n은 가장 높은 번호의 소켓 설명자입니다(ints, 기억?) 및 1개입니다.

소켓 설명자가 읽기/쓰기 준비가 되어 있는지 확인합니다(ioctlsocket(ioctlsocket, FIONBIO, NonBlock) == SOCKET_ERROR) 인수는 정확히 무엇입니까? 이 자습서에서는 select 함수를 사용하여 여러 클라이언트를 처리하는 것을 담당하며 올바른 기능을 사용합니다. client_sockets 배열의 빈 위치는 새 소켓 연결이 들어오고 루프가 0에서 i를 시작할 때마다 검색됩니다. 선택과 유사한 작업을 수행할 수 있는 다른 기능이 있습니다. pselect , poll , ppoll // ReadSet이이 소켓에 대해 표시되어 있으면 이것은 데이터 좋은 기사를 의미하지만 max_client를 할당하는 “소켓 배열에 새 소켓추가”에 문제가 되지 않습니까? 즉, “i = max_client;”를 설정하면 소켓 번호가 max_client보다 작은 클라이언트가 이전에 연결이 끊어지는 경우 어떻게 해야 합니까? 그런 다음 루프에서 0과 동일한 client_socket[i]에서 찾을 수 있습니다. 그런 다음 해당 위치에 새 소켓을 추가하고 max_client를 해당 소켓에 할당합니다. 그러나 ID가 더 높은 소켓은 여전히 사용할 수 있습니다. 선택 기능은 TCP 소켓과 UDP 소켓 중에서 선택하는 데 사용됩니다. 이 함수는 커널에 여러 이벤트가 발생할 때까지 기다리도록 지침을 제공하고 하나 이상의 이벤트가 발생하거나 지정된 시간이 경과한 후에만 프로세스를 일깨워줍니다.

select() 함수는 여러 소켓을 동시에 확인하여 recv()d가 대기 중인지 또는 차단 없이 데이터를 보낼 수 있는지 또는 일부 예외가 발생했는지 확인할 수 있는 방법을 제공합니다. 한 가지 힌트: 클라이언트가 소켓 연결을 제대로 닫지 않으면 이 연결로 보낼 때 프로그(171줄)가 종료됩니다.