넌 블로킹 소켓 예제

인터넷 도메인의 소켓 주소는 호스트 컴퓨터의 인터넷 주소로 구성됩니다(인터넷의 모든 컴퓨터에는 고유한 32비트 주소(IP 주소라고도 함). 또한 각 소켓에는 해당 호스트에 포트 번호가 필요합니다. 포트 번호는 16비트 서명되지 않은 정수입니다. 낮은 숫자는 표준 서비스를 위해 유닉스에서 예약되어 있습니다. 예를 들어 FTP 서버의 포트 번호는 21입니다. 표준 서비스는 클라이언트가 주소를 알 수 있도록 모든 컴퓨터에서 동일한 포트에 있어야 합니다. 그러나 2000이상의 포트 번호는 일반적으로 사용할 수 있습니다. 간단한 예제에서는 이 방법은 충분히 쉬워 보이지만 각 소켓에 대해 이 테스트를 별도로 수행해야 합니다. 여러 소켓을 처리해야 하는 경우 코드의 복잡성이 증가할 수 있습니다.

비 차단 소켓의 기본 개념은 선택의 새로운 개념보다 배우기 쉽지만 구현은 선택과 같이 한 곳에 거주하는 것이 아니라 코드 전체에 분산되므로 무언가를 잊어 버리거나 모든 것을 잡지 못합니다. 변경해야 할 장소입니다. 이것은 비 차단 소켓이 가까운 호출이지만 초보자를위한 두 번째 가장 쉬운 방법이 될 것이라고 말하는 이유입니다. 나는 당신이 선택에 익숙한 후이 하나를 시도해야한다고 말하고 싶습니다. 이제 우리는 소켓의 주요 걸림돌에 와서 – 전송 및 recv는 네트워크 버퍼에서 작동합니다. 주요 초점은 네트워크 버퍼를 처리하는 것이기 때문에 반드시 당신이 그들에게 건네주는 모든 바이트 (또는 그들로부터 기대하는 것)를 처리하지는 않습니다. 일반적으로 관련 네트워크 버퍼가 채워지거나(전송) 또는 비우면 반환됩니다(recv). 그런 다음 처리한 바이트 수를 알려줍니다. 메시지가 완전히 처리될 때까지 다시 호출하는 것은 사용자의 책임입니다. 위의 클라이언트를 실행하면 전혀 차단되지 않았음을 알 수 있습니다.

그러나 클라이언트에 문제가 있습니다 – 모든 데이터를 전송하지 않았습니다. socket.send 메서드는 전송된 바이트 수를 반환합니다. setblocking(0)을 호출하여 소켓을 비차단으로 만들면 작업이 완료될 때까지 기다리지 않습니다.