使用 os.OpenFile() 而不是 net.Listen()

Using os.OpenFile() instead of net.Listen()

我深入研究了 os.OpenFilenet.Listen 的调用堆栈,看看是否可以使用 os.OpenFile 创建 UNIX 域套接字。以下是我的尝试。但是,在跟踪两个调用堆栈(os.OpenFilenet.Listen 之后)我仍然感到困惑。显然,下面的代码没有从文件中读取数据,而是将数据存储到文件系统中。

  1. 如何使用 os.OpenFile 实现 UNIX 域套接字?
  2. 如果 os.ModeSocket 不与 os.OpenFile 一起使用来创建 UNIX 套接字,它的用途是什么?
package main

import (
    "fmt"
    "log"
    "os"
)

func main() {
    sock, err := os.OpenFile("f.sock", os.O_RDWR|os.O_CREATE, os.ModeSocket|os.ModePerm)
    defer sock.Close()
    if err != nil {
        log.Panic(err)
    }
    n, err := sock.WriteString("hello\n")
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(n)
    }
    b := make([]byte, 10)
    n, err = sock.Read(b)
    fmt.Println(n)
    if err != nil {
        fmt.Println("error reading: ", err)
    }
    fmt.Println(b)
}
  1. 没有。 OpenFile 是用于打开文件的通用 api,如果您想使用 unix socket

  2. ,请使用 net.Listen("unixpacket", "f.sock")net.Dial("unixpacket", "f.sock")
  3. os.ModeSocket只是socket fd的一个*nix注册标志,当你想过滤fd类型时使用