go - 在golang中将控制信号转换为字节ascii十六进制代码

标签 go websocket ascii gorilla

我正在尝试在 golang 中捕获 ctrl+c、ctrl+z、ctrl+\等信号,并将其等效的十六进制代码写入 websocket。我正在做类似下面的事情。

func (c *poc) writePump() {
    var b = make([]byte, 1)
    d := make(chan os.Signal, 1)
    signal.Notify(d, syscall.SIGINT, syscall.SIGTSTP, syscall.SIGQUIT)

    for {
        os.Stdin.Read(b)
        err = c.ws.WriteMessage(websocket.TextMessage, b)

        go func() {
            for {
                s := <-d
                err = cli.sendControlSignalToWebsockets(s)
            }
        }()

        if err != nil {
            log.Printf("Failed to send UTF8 char: %s", err)
        }
    }
}

func (c *poc) sendControlSignalToWebsockets(s os.Signal) error {
    var err error

    switch s {
    case syscall.SIGINT:
        err = c.ws.WriteMessage(websocket.TextMessage, []byte{'\003'})
    case syscall.SIGTSTP:
        err = c.ws.WriteMessage(websocket.TextMessage, []byte{'\x1a'})
    case syscall.SIGQUIT:
        err = c.ws.WriteMessage(websocket.TextMessage, []byte{'\x1c'})
    }

    if err != nil {
        return err
    }
    return nil
}

相反,我想做类似的事情,捕获所有信号,而不是将每个信号硬编码为十六进制代码,而是将信号转换为十六进制代码。

func (c *poc) writePump() {
    var b = make([]byte, 1)
    d := make(chan os.Signal, 1)
    signal.Notify(d)

    for {
        os.Stdin.Read(b)
        err = c.ws.WriteMessage(websocket.TextMessage, b)

        go func() {
            for {
                s := <-d
                //???? do some conversions and write it to websocket
            }
        }()

        if err != nil {
            log.Printf("Failed to send UTF8 char: %s", err)
        }
    }
}

很想知道是否有人有任何想法。谢谢!

最佳答案

听起来您正在尝试通过 websocket 传递信号。因此,您需要一种编码方式,不会与其他字符混淆,因此使用不可打印的 ascii 字符是一个合理的举措。

由于没有将 syscall 信号映射到 byte 的约定,您不能只导入它 - 但好消息! - 你可以创建自己的!

创建一个 map[syscall.Signal]bytemap[os.Signal]byte 并从那里进行转换:

// Create a mapping between syscalls and bytes
var syscallByteMap = map[syscall.Signal]byte{
  syscall.SIGINT: '\003',
  ...more here...
}

...truncated...

        go func() {
        for {
            s := <-d
            // Look up the signal in the map
            b, ok := syscallByteMap[s]
            if ok {
                err = c.ws.WriteMessage(websocket.TextMessage, []byte{b})
            } else {
                err = nil
            }

        }
    }()

关于go - 在golang中将控制信号转换为字节ascii十六进制代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48914378/

相关文章:

Json 编码直接到标准输出

go - 如何创建在responseWriter.Write 上返回错误的http.ResponseWriter 模拟实例?

c++ - 通过手动安装库来修复gcc undefined include <>

python - 在 Django 2.0 中使用 Slack RTM API

将 ASCII 字符串转换为 7 位 GSM 编码方案

c - RGB565 格式的 ASCII 字符

乱码 : Join with changeable 'where' conditions

javascript - 为什么即使使用 HTML5 也无法通过浏览器进行 UDP 连接?

python - 使用 Python 通过 WebSockets 访问 API

regex - Oracle查询查找不包含字符的字符串