gpt4 book ai didi

go - 无法使用net.Conn.Read从UNIX套接字读取

转载 作者:行者123 更新时间:2023-12-03 10:08:34 29 4
gpt4 key购买 nike

我正在尝试使用GO与服务进行简单的UNIX套接字通信。为了测试,我创建了一个socket,如下所示:

$ nc -vlU /tmp/sock
Bound on /tmp/sock
Listening on /tmp/sock
在GO中,我 net.Dial并尝试写一些东西,然后阅读。我在 nc控制台中看到了书面数据,所以我知道这是可行的。但是 net.Conn.Read操作似乎是非阻塞的,并且将立即以零长度返回。从我已阅读的所有内容以及所看到的示例中,此操作应该会阻塞。
buf := make([]byte, 0, 4096)
ctl, err := net.Dial("unix", "/tmp/sock")
for {
ctl.Write([]byte("test write\n"))
n, err := ctl.Read(buf)
fmt.Printf("Len:%v, Data:%v, err:%v", n, buf, err)
}
我看到连接通过并写入了数据...
Connection received on /tmp/sock
test write
test write
test write
test write
...
但是,GO控制台循环播放时不会阻塞,报告长度为零且没有错误
Len:0, Data:[], err:<nil>
Len:0, Data:[], err:<nil>
Len:0, Data:[], err:<nil>
Len:0, Data:[], err:<nil>
...
当然,如果我在 nc控制台中键入任何内容,GO程序输出中也不会发生任何有趣的事情。
知道我在做什么错吗?

最佳答案

简短答案

buf := make([]byte, 0, 4096)
此代码使用 len=0缓冲!
buf := make([]byte, 4096)
例子
这是我使用的一些示例,它们都可以工作。
实际上,套接字读写应该在 two goroutines中进行
package main

import (
"bufio"
"fmt"
"io"
"net"
"time"
)

func main() {
buf := make([]byte, 0, 4096)
fmt.Println(buf)
main03()
}

func main01() {
// nc -vlU /tmp/sock0120
ctl, err := net.Dial("unix", "/tmp/sock0120")
if err != nil {
fmt.Println(err)
return
}
reader := bufio.NewReader(ctl)
for {
time.Sleep(time.Second)
ctl.Write([]byte("test write\n"))
msg, err := reader.ReadString('\n')
fmt.Printf("Len:%v, Data:%v, err:%v\n", len(msg), msg, err)
}
}

func main02() {
// nc -vlU /tmp/sock0120
buf := make([]byte, 4)
ctl, err := net.Dial("unix", "/tmp/sock0120")
if err != nil {
fmt.Println(err)
return
}
reader := bufio.NewReader(ctl)
for {
time.Sleep(time.Second)
ctl.Write([]byte("test write\n"))
n, err := io.ReadFull(reader, buf)
fmt.Printf("Len:%v, Data:%v, err:%v\n", n, buf, err)
}
}

func main03() {
// nc -vlU /tmp/sock0120
buf := make([]byte, 4)
ctl, err := net.Dial("unix", "/tmp/sock0120")
if err != nil {
fmt.Println(err)
return
}
for {
time.Sleep(time.Second)
ctl.Write([]byte("test write\n"))
n, err := ctl.Read(buf)
fmt.Printf("Len:%v, Data:%v, err:%v\n", n, buf, err)
}
}

关于go - 无法使用net.Conn.Read从UNIX套接字读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65799886/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com