WindowsとWSL間でUNIXソケットを利用した通信が可能に
2018年2月7日にリリースされた「Build 17093」では、「Windows」のソフトウェアと「WSL」上で動作する「Linux」のソフトウェア間で、UNIXソケット(UNIXドメインソケット/AF_UNIX)を利用した通信が行えるようになりました。以前リリースされた「Build 17063」において、「Windows」上でUNIXソケットを利用できるようになりました。
この機能のサポートを「WSL」に拡大し、「Windows」と「WSL」間の相互運用性が改善されました。
例えば「Linux」のソフトウェアは、UNIXソケットを利用して「Windows」のソフトウェアやサービスと通信し、相互にデータをやりとりすることができます。
また「Windows」と「Linux」の双方から通信可能なソフトウェアを開発することも可能です。
UNIXソケットに関する制限
現在以下のUNIXソケットに関する制限があります。1.UNIXソケットと通信できるクライアントの種類
「WSL」のUNIXソケットは、「Win32」のUNIXソケットと「WSL」のUNIXソケットとのみ通信することができます。しかし両方と同時に通信することはできません。
「WSL」のUNIXソケットサーバーは、「Win32」のUNIXソケットと「WSL」のUNIXソケットのいずれかからのみ、接続を受け入れることができます。
接続可能なクライアントの種類は、UNIXソケットのパスにより異なります。
UNIXソケットのパスは、「bind」や「connect」に指定するパスのことです。
UNIXソケットのパスがDrvFS内にある
UNIXソケットのパスが「DrvFS」内(/mnt/cなど)にある場合、そのUNIXソケットは「Windows」のUNIXソケットとのみ通信可能です。UNIXソケットのパスがVolFs内にある
一方UNIXソケットが「VolFs(LxFS)」内(/tmpなど)にある場合、そのUNIXソケットは「WSL」のUNIXソケットとのみ通信可能です。2.WSLのUNIXソケットがWindowsのUNIXソケットと接続する場合
「WSL」のUNIXソケットが「Windows」のUNIXソケットと接続する場合、UNIXソケットを作成した後の最初のUNIXソケットに対する操作は、「bind」もしくは「connect」でなければなりません。それ以外の操作を行うと、その「WSL」のUNIXソケットは、「WSL」のUNIXソケットとのみ通信可能なUNIXソケットになります。
3.補助データの非サポート
「Windows」のUNIXソケットは、「SCM_RIGHTS」とった補助データをサポートしていません。そのため「Windows」と「WSL」間の通信においても、補助データをサポートしていません。
パーミッションについて
UNIXソケットに対して「bind」や「connect」を行う際、そのパスに対して適切なパーミッションが設定されている必要があります。特に「Windows」と「WSL」間でUNIXソケットによる通信を行う場合は、「Windows」及び「Linux」から見てアクセス可能なパーミッションが設定されている必要があります。
つまりそのUNIXソケットは、「Windows」と「Linux」のパーミッションが同時に適用されることになります。
サンプルコード
UNIXソケットを提供するWindowsアプリ(サーバー)と、そのUNIXソケットに接続するLinuxアプリ(クライアント)のサンプルコードです。シンプルなサンプルであり、見れば分かるコードかと思います。
補足
事前に「DrvFs」のメタデータを有効にしてから、サンプルを試してみてください。「DrvFs」のメタデータサポートを有効にする方法は、以下を参照してください。
そうすればパーミッションの違いによる挙動を確認できます。
Windowsアプリ(サーバー)
Linuxアプリ(クライアント)
「Windows」と「Linux」では、ソケットへのパス(ファイルへのパス)の指定方法が異なる点に注意ください。