登录
首页 >  Golang >  Go问答

在 Windows 下使用 telnet/ssh 向现有的 TCP 套接字中写入数据

来源:stackoverflow

时间:2024-02-26 12:09:25 111浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《在 Windows 下使用 telnet/ssh 向现有的 TCP 套接字中写入数据》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

我正在尝试从另一个控制台/终端应用程序启动的 go 程序将文本写入/打印到屏幕 - 一个从老式公告板系统 (bbs) 启动的“门”程序。

bbs 本身通过 telnet 连接运行,localhost:2323。当启动我的程序时,bbs 会自动添加正确的套接字句柄作为参数,然后我可以使用 flag 读取该句柄(它是一个整数,例如 236)。

显然,在 linux 中,我只需使用 fmt.println("hello world!") 使用 os.stdout...但在 windows 上,我需要以某种方式将 go 程序的输出通过管道/重定向到提供的套接字.

这是我开始使用的函数:

func writeout(fd int, buf []byte) bool {
    for len(buf) > 0 {
        n, err := syscall.write(syscall.handle(fd), buf)
        if err != nil {
            fmt.println(err)
            return false
        }
        buf = buf[n:]
    }
    return true
}

调用自:

writeOut(socketInt, []byte("Writing to Windows socket..."))

返回的错误为:参数不正确

我做错了什么,在 go 中如何实现这一点?


正确答案


您不能随意将文件或套接字句柄传递给另一个没有从您的进程继承它们的进程。每个进程都有自己独特的一组句柄。在 posix 中,继承套接字句柄是可能的(尽管不推荐),但在 windows 中,它们根本无法被继承(请参阅 Are TCP SOCKET handles inheritable?)。

不过,在调用 createprocess 时,您可以将 redirect stdout 发送到 tcp 套接字,这样在调用时,您的程序确实可以将 fmt.println 发送到 stdout,并且输出将直接发送到套接字:

func serveDoor(conn *net.TCPConn, name string, args ...string) {
    defer conn.Close()

    cmd := exec.Command(name, args...)
    cmd.Stdin = conn
    cmd.Stdout = conn
    cmd.Stderr = conn

    err := cmd.Run()
    fmt.Println("door finished:", err)
}

(full gist)

另一种解决方案是使用管道并将其泵送到插座。

好了,本文到此结束,带大家了解了《在 Windows 下使用 telnet/ssh 向现有的 TCP 套接字中写入数据》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>