WSL2とWindows間の通信の実装【Unityを例に】


WSL2 は、独自の IP アドレスを持つ独立した仮想マシンとみなすことができ、仮想ルータを介して Windows に接続されているため、Windows ホスト アドレスに直接アクセスすることができず、動的に取得する必要があります。

(1) Windows ファイアウォールが有効な WSL2 アクセス

デフォルトでは、Windows ファイアウォールは、WSL2 アプリケーションが Windows ネットワークにアクセスすることをブロックします (参照: WSL2 ネットワークの Windows ファイアウォールに「許可」ルールを追加する · 問題 #4585 · Microsoft/WSL (github.com) )。解決策は、ファイアウォール ルールを追加することです。 WSL2 による Windows へのアクセスを許可します。管理者として PowerShell を開き、次のコマンドを入力してください。

PS C:\> New-NetFirewallRule -DisplayName "WSL" -Direction Inbound  -InterfaceAlias "vEthernet (WSL)"  -Action Allow

ファイアウォールの詳細設定で受信ルールを表示します。

実際、すべてのファイアウォールを直接オフにすることもできます。

(2) WSL2はWindowsのIPアドレスを取得して接続を確立します

Windows の IP は WSL2 に応じて変化するため、スムーズにアクセスできるように、毎回起動する前にこの IP を取得する必要があります。

import numpy as np
import socket
import os

def connect_unity(host,port):
    global sock
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host, port))
    print('连接已建立')

import subprocess
cmd_get_ip = 'grep -oP  "(\d+\.)+(\d+)" /etc/resolv.conf'
host = subprocess.run(
        cmd_get_ip, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True
        ).stdout.strip() # 获取windows的IP
 
port = 5005        # Unity监听的端口号

connect_unity(host,port)

WSL2 IP アドレス:

$ip a |grep "global eth0"

出力は次のとおりです。

WSL2のIPアドレスは172.18.119.46です。

(3) Unityを使用して監視と接続を行う

監視には 0.0.0.0 が使用されます。これは、このマシン上のすべての IP アドレスを監視することと同等です。

public class U2P
{  
    private U2P()
    {
        serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPAddress ipAddress = IPAddress.Parse("0.0.0.0");
        serverSocket.Bind(new IPEndPoint(ipAddress, 5005));
        serverSocket.Listen(5); 
        StartServer();
    }
    private void StartServer()
    {
        serverSocket.BeginAccept(AcceptCallback, null);
    }
    private void AcceptCallback(IAsyncResult ar)
    {
        Socket sc = serverSocket.EndAccept(ar); 
        if (clientSocket == null)
        {
            clientSocket = sc; 
            isConnected = true;
            Debug.Log("连接成功");
        }
    }
public float[] RecData()
    {
        try
        {
            if (clientSocket != null)
            {
                int canRead = clientSocket.Available;
                byte[] buff = new byte[canRead];
                clientSocket.Receive(buff);
                string str = Encoding.UTF8.GetString(buff);
                //Debug.Log(str);
                if (str == "")
                {
                    return null;
                }
                //str = str.Replace("[","").Replace("]","").Replace("\n")Replace("Replace(
                //Debug.Log(“接受消息:”+ str);
                string[] strData = str.Split(',');
                float[] data = new float[strData.Length];
                for (int i = 0; i < strData.Length; i++)
                {
                    data[i] = float.Parse(strData[i]);
                }
                //Debug.Log("数据:"+data[7]);
                return data;
            }
        }
        catch (Exception ex)
        {
            Debug.LogError("发生错误:"+ex);
            if (clientSocket != null)
            {
                clientSocket.Close(); 
                clientSocket = null; 
                isConnected = false;
                StartServer();
            }
        }
        return null;
    }
    public void SendData(List<float> data)
    {
        try
        {
            if (clientSocket != null)
            {
                string strData = "";
                for (int i = 0; i < data.Count; i++)
                {
                    strData += data[i];
                    if (i != data.Count - 1)
                    {
                        strData += ",";
                    }
                }
                // 请补充使用UTF8编码,使用clientSocket发送strData到服务器的代码
                byte[] dataBytes = Encoding.UTF8.GetBytes(strData);
                clientSocket.Send(dataBytes);
            }
        }
        catch (Exception ex)
        {
            //Debug.LogError("发生错误:”+ex);
            if (clientSocket != null)
            {
                clientSocket.Close();
                clientSocket = null;
                isConnected = false;
                StartServer();
            }
        }
    }
}

参考:

https://mp.csdn.net/mp_blog/creation/editor?spm=1000.2115.3001.5352

おすすめ

転載: blog.csdn.net/cycler_725/article/details/130374433