리눅스 블로킹 소켓 예제

이 예술적 터치의 비유는 네트워크 처리량과 성능을 측정하기 위해 Linux가 제공하는 풍부한 도구 집합입니다. 이를 바탕으로 프로그래머는 특정 매개 변수를 조정하거나 때로는 솔루션을 재설계하여 예상결과를 달성합니다. 비차단 소켓은 accept() API에 비슷한 영향을 미칩니다. accept()를 호출하면 클라이언트가 아직 연결되지 않은 경우 `작업 차단`을 반환하여 대기 없이 accept()를 완료할 수 없다는 것을 알려줍니다… 지금까지 이 장에서는 select()를 사용하여 소켓에서 데이터를 읽을 수 있는 시기를 감지할 수 있습니다. 그러나 결과를 기다릴 필요없이 send(), recv(), connect(), accept() 등을 호출할 수 있는 것이 유용한 경우가 있습니다. “비 차단”모드에 배치되도록 설명기를 설정할 수 있습니다. 비차단 모드에 놓이면 작업이 완료될 때까지 기다리지 않습니다. 이것은 여러 개의 연결된 소켓 간에 전환해야 하고 프로그램이 “잠길”을 일으키지 않도록 하려는 경우 매우 유용한 도구입니다. 우리는 비 차단 I /O가 들어오는 곳, 잘 행동 시민이되고 싶어요.

네트워크에서 읽기 및 쓰기를 차단하는 기존의 접근 방식은 프로그래밍하기가 매우 쉽지만 패킷을 펌핑하여 사용할 수 있는 파이프를 채우는 데 관심이 있다면 비차단 TCP 소켓을 사용해야 합니다. 목록 1은 네트워크 읽기 및 쓰기를 위해 비차단 소켓을 사용하는 간단한 코드 조각을 보여 주어집니다. 비차단 소켓은 select() API와 함께 사용할 수도 있습니다. 실제로 이전에 “비 차단”으로 표시된 소켓의 데이터를 기다리려는 지점에 도달하면 select() 다음에 recv()를 호출하는 것만으로 차단 recv()를 시뮬레이션할 수 있습니다. “비차단” 모드는 소켓의 “플래그” 중 하나를 변경하여 설정됩니다. 플래그는 일련의 비트이며 각 플래그는 소켓의 다른 기능을 나타냅니다. 따라서 비차단 모드를 사용하려면 세 단계가 필요합니다: 분산/수집 I/O를 비차단 소켓과 결합하면 그림 1과 같이 상황이 약간 복잡해집니다. 이 털이 많은 문제를 해결하기위한 코드는 목록 3에 표시됩니다. 우리의 서버가 선택된 전화가 차단되지 않는다고 표시한 경우에만 모든 것이 괜찮을까요? 아니요! 이 두 작업 -선택 다음 잘하면 비 차단 호출-비 원자성입니다. 서버가 호출할 때상황이 변경되었을 수 있습니다! 보류 중인 연결은 수락하기 전에 사라질 수 있습니다. 데이터를 보내려는 클라이언트가 데이터를 읽기 전에 사라질 수 있습니다. 데이터는 소켓에 도착하기 전에 다른 프로세스에 의해 소켓에서 읽을 수 있습니다.

클라이언트와 서버마다 연결이 설정되는 시스템은 다소 다르지만 둘 다 소켓의 기본 구문과 관련이 있습니다. 소켓은 프로세스 간 통신 채널의 한쪽 끝입니다. 두 프로세스는 각각 자체 소켓을 설정합니다. 예를 들어 웹 브라우저를 작성한다고 가정해 보겠습니다. 웹 서버에 연결하려고 하지만 서버가 응답하지 않습니다. 사용자가 중지 단추를 누르거나 클릭하면 connect() API가 연결 시도를 중지하도록 할 수 있습니다. 유닉스 도메인의 소켓 주소는 기본적으로 파일 시스템의 항목인 문자 문자열입니다. 그러나 네트워크 프로그래밍이 소켓에 만전을 기하는 것은 아닙니다. 우리는 여전히 기계적 장치이며 결과적으로 대부분의 경우 (특히 고성능 컴퓨팅 환경)의 많은 네트워크에서 주 메모리및 네트워크보다 훨씬 느리다는 하드 디스크를 사용해야하는 문제를 해결하지 못했습니다.

Comments are closed.