AF_UNIX 주소 계열 사용

AF_UNIX 또는 AF_UNIX_CCSID 주소 계열을 사용하는 소켓은 연결 지향성(SOCK_STREAM 유형) 또는 비연결성(SOCK_DGRAM 유형)이 될 수 있습니다.

두 프로세스를 연결하는 외부 통신 기능이 없으므로 두 유형은 모두 신뢰할 수 있습니다.

UNIX 도메인 데이터그램 소켓은 UDP 데이터그램 소켓과 다르게 작동합니다. UDP 데이터그램 소켓의 경우 클라이언트 프로그램은 시스템에서 사용하지 않는 포트 번호를 자동으로 지정하므로 bind() API를 호출할 필요가 없습니다. 서버는 그 후 데이터그램을 해당 포트 번호에 다시 송신할 수 있습니다. 그러나 UNIX 도메인 데이터그램 소켓의 경우에는 시스템이 클라이언트의 경로명을 자동으로 지정하지 않습니다. 따라서 UNIX 도메인 데이터그램을 사용하는 모든 클라이언트 프로그램은 bind() API를 사용해야 합니다. 클라이언트의 bind()에 지정된 것과 정확히 동일한 경로명이 서버에 전달됩니다. 따라서 클라이언트에서 상대 경로명(/로 시작하는 완전한 경로명이 아닌 경로명)을 지정하면 서버는 같은 현재 디렉토리에서 실행 중이 아닌 경우 클라이언트에 데이터그램을 송신할 수 없습니다.

애플리케이션에서 이 주소 계열에 대해 사용할 수 있는 예제 경로명으로는 /tmp/myserver 또는 servers/thatserver를 들 수 있습니다. servers/thatserver의 경우 이는 완전한 경로명이 아닙니다(/가 지정되지 않음). 이는 이 파일 시스템 계층 구조에서 이 항목의 위치를 현재 작업 디렉토리와 관련지어 판별해야 함을 의미합니다.
참고: 파일 시스템 내의 경로명은 NLS를 사용합니다.

다음 그림은 AF_UNIX 주소 계열의 클라이언트/서버 관계를 나타냅니다.

서버 및 클라이언트 AF_UNIX 주소 계열 예제 프로그램에서 사용되는 소켓 이벤트 흐름입니다.

소켓 이벤트 흐름: AF_UNIX 주소 계열을 사용하는 서버 애플리케이션

첫 번째 예제는 다음 API 호출 순서를 사용합니다.

  1. socket() API가 종료점을 나타내는 소켓 설명자를 리턴합니다. 이 명령문은 또한 이 소켓에 스트림 전송(SOCK_STREAM)을 사용하는 UNIX 주소 계열이 사용됨을 식별합니다. socketpair() API를 사용하여 UNIX 소켓을 초기화할 수도 있습니다.

    socketpair() API는 AF_UNIX 또는 AF_UNIX_CCSID 주소 계열에서만 지원됩니다. socketpair() API는 이름 지정되지 않은, 연결된 두 개의 소켓 설명자를 리턴합니다.

  2. 소켓 설명자가 작성된 후에는 bind() API가 소켓의 고유 이름을 가져옵니다.

    UNIX 도메인 소켓의 네임스페이스는 경로명으로 구성됩니다. 소켓 프로그램이 bind() API를 호출하면 파일 시스템 디렉토리에 항목이 작성됩니다. 이 경로명이 이미 존재하는 경우에는 bind()가 실패합니다. 따라서 UNIX 도메인 소켓 프로그램은 종료할 때 항상 unlink() API를 호출하여 이 디렉토리를 제거해야 합니다.

  3. listen()은 서버가 수신 클라이언트 연결을 승인할 수 있도록 합니다. 이 예제에서 백로그는 10으로 설정되어 있습니다. 이는 시스템이 10개의 수신 연결 요청을 큐에 삽입한 후부터 수신 요청을 거부하기 시작함을 의미합니다.
  4. recv() API가 클라이언트 애플리케이션으로부터 데이터를 수신합니다. 이 예제에서 클라이언트는 250바이트의 데이터를 송신합니다. 따라서 SO_RCVLOWAT 소켓 옵션을 사용할 수 있으며, 이는 250바이트의 데이터가 도착할 때까지 recv()가 웨이크업할 필요가 없음을 지정합니다.
  5. send() API가 이 데이터를 클라이언트에 다시 송신합니다.
  6. close() API가 모든 열린 소켓 설명자를 닫습니다.
  7. unlink() API가 파일 시스템에서 UNIX 경로명을 제거합니다.

소켓 이벤트 흐름: AF_UNIX 주소 계열을 사용하는 클라이언트 애플리케이션

두 번째 예제는 다음 API 호출 순서를 사용합니다.

  1. socket() API가 종료점을 나타내는 소켓 설명자를 리턴합니다. 이 명령문은 또한 이 소켓에 스트림 전송(SOCK_STREAM)을 사용하는 UNIX 주소 계열이 사용됨을 식별합니다. socketpair() API를 사용하여 UNIX 소켓을 초기화할 수도 있습니다.

    socketpair() API는 AF_UNIX 또는 AF_UNIX_CCSID 주소 계열에서만 지원됩니다. socketpair() API는 이름 지정되지 않은, 연결된 두 개의 소켓 설명자를 리턴합니다.

  2. 소켓 설명자가 수신된 후에는 connect() API가 서버와의 연결을 설정하는 데 사용됩니다.
  3. send() API가 SO_RCVLOWAT 소켓 옵션을 사용하여 서버 애플리케이션에 설정된 250바이트의 데이터를 송신합니다.
  4. recv() API가 250바이트의 데이터가 모두 도달할 때까지 루프됩니다.
  5. close() API가 모든 열린 소켓 설명자를 닫습니다.