리눅스 블로킹 소켓 예제

메시지를 전송할 수 있는 소켓에 사용할 수 있는 메시지 공간이 없는 경우 일반적으로 () 블록으로 보내십시오. 유닉스 도메인의 소켓 주소는 기본적으로 파일 시스템의 항목인 문자 문자열입니다. 예를 들어 웹 브라우저를 작성한다고 가정해 보겠습니다. 웹 서버에 연결하려고 하지만 서버가 응답하지 않습니다. 사용자가 중지 단추를 누르거나 클릭하면 connect() API가 연결 시도를 중지하도록 할 수 있습니다. 우리의 서버가 선택된 전화가 차단되지 않는다고 표시한 경우에만 모든 것이 괜찮을까요? 아니요! 이 두 작업 -선택 다음 잘하면 비 차단 호출-비 원자성입니다. 서버가 호출할 때상황이 변경되었을 수 있습니다! 보류 중인 연결은 수락하기 전에 사라질 수 있습니다. 데이터를 보내려는 클라이언트가 데이터를 읽기 전에 사라질 수 있습니다. 데이터는 소켓에 도착하기 전에 다른 프로세스에 의해 소켓에서 읽을 수 있습니다. 이 문제에 대한 기존의 대답은 선택 시스템 호출입니다.

관심 있는 다양한 차단 호출을 나타내는 select를 호출합니다. 그러나 네트워크 프로그래밍이 소켓에 만전을 기하는 것은 아닙니다. 우리는 여전히 기계적 장치이며 결과적으로 대부분의 경우 (특히 고성능 컴퓨팅 환경)의 많은 네트워크에서 주 메모리및 네트워크보다 훨씬 느리다는 하드 디스크를 사용해야하는 문제를 해결하지 못했습니다. 리눅스에서 TCP 소켓 OS TCP/IP 스택의 기능을 조작할 수 있는 옵션의 풍부한 세트와 함께 제공. TCP 송신 및 수신 버퍼 크기와 같은 성능에 중요한 몇 가지 옵션은 connect() API가 약간 다릅니다. 비차단 모드에서 connect()를 호출하려고 하면 API가 즉시 연결할 수 없는 경우 `진행 중인 작업`에 대한 오류 코드가 반환됩니다. connect() 를 다시 호출할 때 나중에 `이미 진행 중인 작업`을 알려 `이미 진행 중`이라고 알려주거나 연결이 수행되었음을 알리는 성공적인 반환 코드를 제공할 수 있습니다. 이에 대한 대답은 비차단 I/O입니다. 소켓에 플래그를 설정하여 해당 소켓을 비차단으로 표시합니다. 즉, 해당 소켓에서 호출을 수행할 때(예: 읽기 및 쓰기) 호출을 완료할 수 없는 경우 대신 EWOULDBLOCK 또는 EAGAIN과 같은 오류로 실패합니다. “비차단” 모드는 소켓의 “플래그” 중 하나를 변경하여 설정됩니다.

플래그는 일련의 비트이며 각 플래그는 소켓의 다른 기능을 나타냅니다. 그래서, 비 차단 모드를 설정하려면 세 단계가 필요합니다 : 이것은 소켓 호출의 단순화 된 설명입니다; 도메인 및 유형에 대한 다른 많은 선택 사항이 있지만 가장 일반적인 항목입니다. 소켓 맨 페이지를 보려면 여기를 클릭하십시오. 다른 옵션은 리눅스에서 /proc 의사 파일 시스템을 사용하여 설정할 수 있습니다 (위의 두 포함), 리눅스 배포판이 특정 옵션을 해제하지 않는 한, 당신은 그들을 조정할 필요가 없습니다. 널리 사용되는 소켓 유형, 스트림 소켓 및 데이터그램 소켓이 있습니다. 스트림 소켓은 통신을 연속 문자 스트림으로 처리하고 데이터그램 소켓은 전체 메시지를 한 번에 읽어야 합니다. 각 프로토콜은 자체 통신 프로토콜을 사용합니다. 스트림 소켓은 신뢰할 수 있는 스트림 지향 프로토콜인 TCP(전송 제어 프로토콜)를 사용하고 데이터그램 소켓은 신뢰할 수 없고 메시지 지향적인 UDP(유닉스 데이터그램 프로토콜)를 사용합니다. 인터넷 도메인의 소켓 주소는 호스트 컴퓨터의 인터넷 주소로 구성됩니다(인터넷의 모든 컴퓨터에는 고유한 32비트 주소(IP 주소라고도 함). 또한 각 소켓에는 해당 호스트에 포트 번호가 필요합니다.

Sorry, comments are closed for this post.