使用os.OpenFile()代替net.Listen()

时间:2019-07-03 03:55:33

标签: sockets unix go file-descriptor

我已经深入研究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 个答案:

答案 0 :(得分:3)

  1. 否。 OpenFile是用于打开文件的通用api,如果要使用unix套接字,请使用net.Listen("unixpacket", "f.sock")net.Dial("unixpacket", "f.sock")

  2. os.ModeSocket只是套接字fd的* nix注册标志,在您要过滤fd类型时使用