求助:有人有空用 go 实现这段 c 代码吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
LonnyWong
V2EX    程序员

求助:有人有空用 go 实现这段 c 代码吗?

  •  
  •   LonnyWong 2023-06-07 07:49:59 +08:00 4023 次点击
    这是一个创建于 860 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://github.com/PowerShell/openssh-portable/blob/latestw_all/contrib/win32/win32compat/tncon.c

    不知道有没有人有空将这个 c 代码用 go 重写出来,可以变成一个 go package ,最好不用 cgo (除非能让用户方便地编译安装)。

    最好 queue_terminal_window_change_event() 能变成一个 go 回调。

    在用 go 重写时,可以参考这个代码: https://github.com/chzyer/readline/blob/master/rawreader_windows.go

    或许 ChatGPT 可以帮忙减轻一部分工作。

    关联 issue: https://github.com/trzsz/trzsz-ssh/issues/5#issuecomment-1579581438

    34 条回复    2023-06-07 14:57:08 +08:00
    bigtang
        1
    bigtang  
       2023-06-07 08:09:25 +08:00
    用 chatgpt 一段一段转不行吗?
    LonnyWong
        2
    LonnyWong  
    OP
       2023-06-07 08:21:13 +08:00 via iPhone
    @bigtang 应该是可以的,我只是没空搞。看有没有人有兴趣参与。
    deorth
        3
    deorth  
       2023-06-07 08:22:33 +08:00 via Android
    没有,得加钱
    LonnyWong
        4
    LonnyWong  
    OP
       2023-06-07 08:25:14 +08:00 via iPhone   1
    @deorth 哈,说的好,我也想有钱收。开源搞了这么久,只有一个哥们赞赏了,见 https://github.com/trzsz/trzsz-go 最下面的感谢。
    token10086
        5
    token10086  
       2023-06-07 09:50:02 +08:00
    本来想上来骂两句,结果一看是做开源,我闭嘴了。你们到底谁有空帮作者转转,我点星星关注了
    xdeng
        6
    xdeng  
       2023-06-07 10:03:12 +08:00
    跟系统 API 打交道就不可能不用 cgo
    proxytoworld
        7
    proxytoworld  
       2023-06-07 10:05:32 +08:00
    只需要这一个 c 文件?
    whoami9894
        8
    whoami9894  
       2023-06-07 10:10:57 +08:00
    @xdeng 谁告诉你的?
    IanHo
        9
    IanHo  
       2023-06-07 10:22:36 +08:00
    chatgpt 真的好使,建议试试
    Nazz
        10
    Nazz  
       2023-06-07 10:34:27 +08:00
    @xdeng 系统调用不需要 CGO
    LonnyWong
        11
    LonnyWong  
    OP
       2023-06-07 10:37:02 +08:00
    @proxytoworld 对,就一个文件。然后我在网上找到了 https://github.com/moby/term/blob/9c3c875fad924eb6c9dd32a361b5fc0a49a4feb9/windows/ansi_reader.go#L34

    我不知道这个 NewAnsiReader 和 ReadConsoleForTermEmul 会有什么区别。Ctrl + Space 以及 窗口变更大小时的事件,估计是还不支持的。给作者提了个 issue: https://github.com/moby/term/issues/44 ,不知作者会怎么看。
    ysc3839
        12
    ysc3839  
       2023-06-07 10:37:28 +08:00 via Android   1
    怀疑是 X-Y Problem ,建议说原始需求
    ysc3839
        13
    ysc3839  
       2023-06-07 10:39:24 +08:00 via Android
    如果是为了兼容 Win7 等老系统,建议放弃,让用户去用 winpty 等方案
    LonnyWong
        14
    LonnyWong  
    OP
       2023-06-07 10:43:10 +08:00
    @ysc3839 我感觉也是。ReadConsoleForTermEmul 这个是专门为 ssh 开发的,感觉兼容性应该会做的很不错。NewAnsiReader 我看他首页的目标也是 term helper functions 。主要是键盘能按出的组合键太多了,我不清楚他们之间会有什么样的差异,或者作者自己会很清楚。
    LonnyWong
        15
    LonnyWong  
    OP
       2023-06-07 10:45:26 +08:00
    @ysc3839 Win11 也不支持 Ctrl + Space ,从 os.Stdin 读不到任何数据,从 ReadConsoleInputW 是可以读到的。但不能与 os.Stdin 同时用,用 ReadConsoleInputW 就得确保所有的键都转换正确,要不然就可能引入其他的问题。
    ysc3839
        16
    ysc3839  
       2023-06-07 10:46:09 +08:00 via Android
    @LonnyWong 所以你是没用 ConPTY ?
    ysc3839
        17
    ysc3839  
       2023-06-07 10:51:20 +08:00 via Android
    @LonnyWong 是我搞烦了,获取输入的话要开启 ENABLE_VIRTUAL_TERMINAL_INPUT
    https://learn.microsoft.com/en-us/windows/console/setconsolemode
    老系统就让用户去用 MSYS2 吧,没有折腾的必要
    LonnyWong
        18
    LonnyWong  
    OP
       2023-06-07 10:53:22 +08:00
    @ysc3839 https://github.com/trzsz/trzsz-go 这个就是用 ConPTY 的,超级慢。

    然后 https://github.com/trzsz/trzsz-ssh 是直接连远程服务器的,没用 ConPTY ,如果远程服务器不是 Windows ,就很快。
    ysc3839
        19
    ysc3839  
       2023-06-07 10:55:08 +08:00 via Android
    @LonnyWong 嫌慢的话可以尝试换成 winpty 。你看看网上一堆 Windows 终端都是用 ConPTY 的,也不见他们嫌慢。
    LonnyWong
        20
    LonnyWong  
    OP
       2023-06-07 11:01:02 +08:00
    @ysc3839 我说的慢是指 Windows 的 stream IO 特别慢。从 trzsz 进程,将数据通过 stdin 传给 ConTPY 时,这个过程超级慢。
    whitehack
        21
    whitehack  
       2023-06-07 11:11:06 +08:00
    给了个 star.实用工具
    Masoud2023
        22
    Masoud2023  
       2023-06-07 11:21:02 +08:00
    看到那行`#include <windows.h>`我觉得你不用 cgo 基本就等于做梦了
    xdeng
        23
    xdeng  
       2023-06-07 11:31:30 +08:00
    @Nazz 说错了
    cppc
        24
    cppc  
       2023-06-07 11:34:32 +08:00
    那个代码里面调用了 win32 函数,纯 GO 怕是不得行
    LonnyWong
        25
    LonnyWong  
    OP
       2023-06-07 11:39:07 +08:00
    @Masoud2023
    @cppc

    不是纯 Go ,只是最好不用 CGO ,可以调用 win32 的 dll ,参考 https://github.com/chzyer/readline/blob/master/rawreader_windows.go 这个来实现。
    timonwong
        26
    timonwong  
       2023-06-07 11:42:12 +08:00
    不见得要 cgo ,不过要 syscall
    ysc3839
        27
    ysc3839  
       2023-06-07 11:51:29 +08:00 via Android
    所以说了这么多楼主有去试一下 ENABLE_VIRTUAL_TERMINAL_INPUT 吗?
    现成的包都有 https://pkg.go.dev/cdr.dev/coder-cli/internal/x/xterminal
    ysc3839
        29
    ysc3839  
       2023-06-07 12:53:27 +08:00 via Android
    @LonnyWong 所以原始问题是什么?
    LonnyWong
        30
    LonnyWong  
    OP
       2023-06-07 13:06:39 +08:00 via iPhone
    @ysc3839 关联 issue 里说的问题 https://github.com/trzsz/trzsz-ssh/issues/5#issuecomment-1579581438
    Ctrl + Space 键的问题。

    另外,我发现 https://github.com/PowerShell/openssh-portable/blob/latestw_all/contrib/win32/win32compat/tncon.c 这里面订阅窗口大小变更事件的做法挺好的,比我每秒检测一下窗口大小有没有变化好多了。
    ysc3839
        31
    ysc3839  
       2023-06-07 13:25:45 +08:00 via Android
    @LonnyWong 这个问题确实是只能自己解析了。

    不过我自己的态度是,这种问题还是不要在自己程序里解决,尤其是移植起来很麻烦的情况。
    不知道改用 mintty 是否能解决,不行的话还可以试试 MSYS2 兼容层。
    LonnyWong
        32
    LonnyWong  
    OP
       2023-06-07 13:31:41 +08:00 via iPhone
    @ysc3839 我感觉 https://github.com/moby/term/blob/9c3c875fad924eb6c9dd32a361b5fc0a49a4feb9/windows/ansi_reader.go#L34 这个稍微改一下,或许也是可以的,看作者会不会支持了。
    lysS
        33
    lysS  
       2023-06-07 14:20:11 +08:00
    这可不是一个 c 文件的事,通常 h 引 h, h 又引 h
    LonnyWong
        34
    LonnyWong  
    OP
       2023-06-07 14:57:08 +08:00 via iPhone
    @lysS 这个真的就这个文件,外加一个 .h
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5093 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 09:36 PVG 17:36 LAX 02:36 JFK 05:36
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86