WSL2 pode ser considerado uma máquina virtual independente com seu próprio endereço IP independente, conectado ao Windows por meio de um roteador virtual, portanto, WSL2 não pode acessar diretamente o endereço de host do Windows e precisa obtê-lo dinamicamente.
(1) Firewall do Windows habilitou acesso WSL2
Por padrão, o firewall do Windows bloqueia o acesso de aplicativos WSL2 à rede Windows (consulte: Adicionar regra "permitir" ao firewall do Windows para rede WSL2 · Problema nº 4585 · microsoft/WSL (github.com) ) . A solução é adicionar regras de firewall permitir acesso WSL2 ao Windows. Abra o PowerShell como administrador e digite o seguinte comando:
PS C:\> New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
Veja as regras de entrada nas configurações avançadas do firewall:
Na verdade, você também pode desligar todos os firewalls diretamente.
(2) WSL2 obtém o endereço IP do Windows e estabelece uma conexão
Como o IP do Windows mudará em relação ao WSL2, precisamos obter esse IP antes de cada inicialização para garantir um acesso tranquilo.
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)
Endereço IP WSL2:
$ip a |grep "global eth0"
A saída é:
O endereço IP do WSL2 é: 172.18.119.46
(3) Use o Unity para monitorar e conectar
0.0.0.0 é usado para monitoramento, o que equivale a monitorar todos os endereços IP nesta máquina.
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();
}
}
}
}
referência:
https://mp.csdn.net/mp_blog/creation/editor?spm=1000.2115.3001.5352