출처: https://kledgeb.blogspot.com/2017/12/windows-15-unixafunixwin32.html 

Winsock API에서 AF_UNIX이 가능

" Build 17063」에서는 UNIX 소켓이 기본적으로 지원되며, BSD Socket API와 매우 유사한 "Winsock API '를 통해 "AF_UNIX"을 이용하여 Win32 프로세스간에 통신(IPC)을 할 수 있게 되었다 .

현재는 SOCK_STREAM만 지원

현재 사용 가능한 소켓 타입은 "SOCK_STREAM"이다.

"SOCK_STREAM"는 프로세스가 1 : 1로 통신하는 토폴로지에서 사용되는 소켓이다.

"SOCK_DGRAM" 소켓 타입의 지원에 관해서는 의견과 수요 등을 고려하여 향후 빌드에서 지원 될 수 있다.

sockaddr_un 구조체

"sockaddr_un"구조체는 UNIX 소켓의 주소를 정의하는 데 사용되는 구조체이다.

Windows의 구현은 크로스 플랫폼 개발을 촉진하기 위해 UNIX 소켓 주소의 명칭과 정의, 그리고 의미가 Linux와 동일하게 구현되어 있다.

3 종류의 주소 형식

UNIX 소켓의 주소는 다음의 3 종류가 다른 주소 형식이 있습니다.

  1. 경로 이름 (pathname)
  2. 추상 (abstract)
  3. 무명 (unnamed)

경로 이름에 의한 주소는 파일 시스템에 연결되어진 주소이며 Windows 구현에서 지원된다.

"sockaddr_un.sun_path"는 NULL 문자로 끝나는 파일 시스템의 경로를 UTF-8로 지정한다.

추상에 의한 주소는 "sockaddr_un.sun_path"에 NULL 바이트(\0)가 들어간다.

Windows의 구현은 추상에 의한 주소를 지원하고 있지만 현재 구현에서는 자동 바인딩(autobind) 기능을 지원 하지 않기 때문에 추상 주소가 자동으로 생성된다.

이름에 의한 주소는 경로 이름에 묶이지 않는 주소이며, 이 주소도 Windows의 구현에서 지원하고 있다.

그러나 "Winsock 2.0」에서는 무명의 소켓을 생성하는 Socket API의 하나인 ' socketpair "을 지원하지 않는다.

소켓 및 보안

UNIX 소켓은 안전한 통신을 실현하는 구조를 제공한다.

경로 이름에 의한 소켓은 파일이나 (부모)디렉토리의 권한을 적절하게 설정하여 UNIX 소켓 통신의 안전성을 제어 할 수 있다.

예를 들어 Socket API의 "bind"는 소켓 파일을 지정된 경로에 생성한다.

만약 호출 프로세스가 지정된 경로에 있는 디렉토리에 쓰기 권한이 없는 경우 소켓 파일 생성에 실패한다.

마찬가지로 소켓에 연결하는 프로세스는 소켓 파일에 쓰기 권한이 있어야한다.

Windows의 구현에서도 동일한 수준의 보안을 제공한다.

자세한 내용은 AF_UNIX의 도움말 (man)을 참조하자.

Windows에서 UNIX 소켓의 구현

Windows가 구현하고 있는 AF_UNIX의 대부분의 기능은 Windows 커널에서 동작하는 "afunix.sys" 드라이버에서 구현되어 있다.

Windows 커널의 네트워크 스택은 매우 유연하고 확장 가능한 모델을 제공한다.

이로 인해 새로운 네트워크 기능을 쉽게 지원할 수 있게 되어 있다.

"bind" API 호출에 의해 생성된 소켓 파일은 NTFS의 리버스 포인트를 정의하는 것으로 실현되고 있다.

지원되지 않는 기능

현재 다음 기능은 지원되지 않는다.

소켓 유형

다음의 소켓 타입은 지원되지 않는다.

보조 데이터

Linux의 UNIX 소켓은 "SCM_RIGHTS」나 「SCM_CREDENTIALS"라는 보조 데이터를 지원한다.

Windows 구현에서는 보조 데이터는 지원되지 않는다.

자동 바인딩 기능

자동 바인딩 (autobind) 기능은 지원되지 않는다.

socketpair

"socketpair"는 "Winsock 2.0"에서 지원되지 않는다.

AF_UNIX를 이용하여 Windows 응용 프로그램을 개발하려면

AF_UNIX를 이용하여 Windows 응용 프로그램을 개발하는 방법이다.

1.Windows 10 SDK Preview Build 17061 이상 버전을 다운로드

" Windows 10 SDK Preview Build 17061 "를 다운로드한다.

2. afunix 서비스가 실행되고 있는지 확인한다

관리자 권한으로 실행한 명령 프롬프트에서 다음 명령을 실행하여 afunix 서비스가 실행 되고 있는지 확인한다.

sc query afunix

3. 헤더 파일 포함

소스 코드에  "afunix.h"을 포함한다.

      #include <afunix.h>

이후 다른 UNIX 소켓을 이용한 응용 프로그램 개발처럼 " Winsock API "를 이용하여 UNIX 소켓의 처리를 기술한다.

주의 사항