WSL2和Windows之间通信实现【以Unity为例】

这篇具有很好参考价值的文章主要介绍了WSL2和Windows之间通信实现【以Unity为例】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


WSL2可以视为一个独立的虚拟机,具有自己独立的IP地址,通过虚拟路由器与Windows连接,因此WSL2不能直接访问到Windows的主机地址,需要动态获取。

(1)Windows启用防火墙的WSL2的访问

默认情况下Windows的防火墙会阻止WSL2中应用对Windows的网络访问(see: Add "allow" rule to Windows firewall for WSL2 network · Issue #4585 · microsoft/WSL (github.com)),解决办法是添加一条防火墙规则允许WSL2对Windows的访问。请以管理员身份打开PowerShell并键入以下命令:

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

查看防火墙的高级设置中的入站规则:

wsl 防火墙,windows,wsl2,unity

其实也可以直接关闭所有防火墙。

(2)WSL2获取Windows的IP地址并建立连接

由于Windows相对WSL2的IP会发生变化,我们需要每次启动前先获取这个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 Address:

$ip a |grep "global eth0"

输出得到:

wsl 防火墙,windows,wsl2,unity

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文章来源地址https://www.toymoban.com/news/detail-663721.html

到了这里,关于WSL2和Windows之间通信实现【以Unity为例】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【WSL2】在Windows和wsl2中互相网络访问的优雅做法,不用再手动写死IP了

    目前在windows与windows的wsl系统之间,还无法通过相对较固定的方式来互相网络访问,通常需要使用各自的ip来互相访问,而ip可能不是很直观并且可能会有变更,当前教程解决了这个问题,通过hosts映射的方式打通wsl与windows宿主机之间的访问。 脚本的原理:在linux启动时或she

    2024年04月17日
    浏览(30)
  • windows10安装wsl2,centos内核

    检查系统环境 必须运行 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11 才能使用以下命令。 一、开启WSL2特性 【控制面板】【程序】【程序和功能】【启用或关闭Windows功能】 二、下载Linux内核更新包 下载 双击安装 三、设置WSL2为默认版本 四、下载安

    2024年02月12日
    浏览(37)
  • windows10 安装WSL2, Ubuntu,docker

    阅读时长:10分钟 本文内容: window上安装ubuntu虚拟机,并在虚拟机中安装docker,通过docker部署数字人模型,通过vscode链接到虚拟机进行开发调试.调试完成后,直接部署在云端即可. WSL2(Windows Subsystem for Linux)是windows系统默认支持的功能,也就是Windows Linux子系统,类似于一台

    2024年02月12日
    浏览(52)
  • wsl2 ubuntu ip 自动同步到windows端的vscode remote ssh(wsl2 ubuntu 静态ip 固定ip)

    ​ wsl2 中linux版本:ubuntu ​ windows版本: win10/win11 最近装了wsl2,使用vscode远程连接wsl2时遇到了如下问题: 1、wsl2的ip无法固定 2、wsl2的ssh服务不能自动开启。 尝试了网上许多方法,都不能解决,于是决定自己写python脚本解决。 如下方案可以自动将wsl2的ip同步到vscode remote s

    2024年02月03日
    浏览(49)
  • windows10(家庭版)和windows11(家庭版)开启WSL2

    WSL 是什么? WSL的全称为Windows Subsystem for Linux。翻译成中文的意思就是“适用于Windows的Linux子系统”。WSL是一个在Windows 1011上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。 注:如果是windows10,需确保 Windows 10 版本号为 22H2 或更高,操作系统内部版本为 19045.2311 或

    2023年04月18日
    浏览(53)
  • windows11使用wsl2环境安装svox2

    1. wsl --install -d ubuntu-22.04 输入用户名和密码 2. 用以下命令将系统迁移到d盘: wsl --export ubuntu-22.04 d:ubuntuwslubuntu22.04.tar(导出) wsl --import ubuntu d:ubuntuwsl d:ubuntuwslubuntu22.04.tar(导入) wsl --unregister ubuntu-22.04(删除原系统) wsl进入新系统 3.安装miniconda. 4.安装svox2 下载:sxyu/

    2024年02月06日
    浏览(43)
  • windows下的wsl2如何进行docker数据卷挂载

     这是数据卷挂载命令 docker run -it -v /宿主机绝对路径目录: /容器内目录 镜像名  在Linux中我们可以直接使用该命令进行挂载,那在windows如何把我们c盘d盘下的目录挂载到容器呢,其实只要在路径前面加上/mnt就好了,下面来演示一下 首先拉取一个ubuntu镜像 docker pull ubuntu 这是

    2023年04月11日
    浏览(34)
  • 在 Windows 中配置 WSL2 与 Debian 的全流程

    这篇文章记录了我在 Windows 10 上配置 WSL2 与 Debian 的全部流程与参考资料。希望对困扰于 WSL 相关问题的读者提供些许帮助。 谢绝转载。 整体流程如下: 确认 Windows 是否支持 WSL2 安装 Debian 完整 Debian 的基础配置,起码得能用。 确认 Windows 版本为 Windows 10 版本 $$geq$$ 2004 (内部

    2024年02月19日
    浏览(29)
  • windows wsl2(ubuntu)使用xinference快速部署ai模型

    Xorbits Inference(Xinference)是一个性能强大且功能全面的分布式推理框架。可用于大语言模型(LLM),语音识别模型,多模态模型等各种模型的推理。通过 Xorbits Inference,你可以轻松地一键部署你自己的模型或内置的前沿开源模型。无论你是研究者,开发者,或是数据科学家,

    2024年04月11日
    浏览(52)
  • windows wsl2 vscode golang debug不生效问题排查

    golang vscode点击Run- Start Debugging后,看到正常的debug 调用dlv-dap,但是没有命中断点。 原因是我用的wsl2 remote, 默认代码保存在windows上,在wsl里看到的是/mnt/c/xxx的目录,为了在linux中方便使用建立了软连接。最后导致打断点时日志报找不到go文件。 排查思路: 1、在.vscode/launch.

    2024年02月03日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包