社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
因为项目需要接触了相关实现, 以此补足了这方面的知识.
package main
import (
"fmt"
"net"
"os"
"syscall"
)
const (
// socksPath unixsock文件所在地址
socksPath = "./unix_sock"
)
func main() {
// unlink删除已存在的unixSock文件
syscall.Unlink(socksPath)
laddr, err := net.ResolveUnixAddr("unix", socksPath)
if err != nil {
panic(err)
}
l, err := net.ListenUnix("unix", laddr)
if err != nil {
panic(err)
}
fmt.Printf("waiting for conn from unix socksn")
conn, err := l.AcceptUnix()
if err != nil {
panic(err)
}
// msg分为两部分数据
buf := make([]byte, 32)
oob := make([]byte, 32)
_, oobn, _, _, err := conn.ReadMsgUnix(buf, oob)
if err != nil {
panic(err)
}
// 解出SocketControlMessage数组
scms, err := syscall.ParseSocketControlMessage(oob[:oobn])
if err != nil {
panic(err)
}
if len(scms) > 0 {
// 从SocketControlMessage中得到UnixRights
fds, err := syscall.ParseUnixRights(&(scms[0]))
if err != nil {
panic(err)
}
fmt.Printf("parse %d fds: %v n", len(fds), fds)
// os.NewFile()将文件描述符转为 *os.File对象, 并不创建新文件, 通常很少使用到
f := os.NewFile(uintptr(fds[0]), "")
defer f.Close()
// 从文件中读取文本内容
buf := make([]byte, 1024)
n, err := f.Read(buf)
if err != nil {
panic(err)
}
fmt.Printf("read %d data %s from file successn", n, string(buf[:n]))
return
}
err = conn.Close()
if err != nil{
panic(err)
}
}
package main
import (
"fmt"
"net"
"os"
"syscall"
)
const (
// 与receiver监听的unixsocks文件地址一致
socksPath = "xxx"
)
func main() {
file, err := os.Open("./temp")
if err != nil {
panic(err)
}
defer file.Close()
fdnum := file.Fd()
fmt.Printf("%b %b %b %bn", byte(fdnum), byte(fdnum >> 8), byte(fdnum >> 16), byte(fdnum >> 24))
fmt.Printf("ready to send fd: %dn", fdnum)
data := syscall.UnixRights(int(fdnum))
raddr, err := net.ResolveUnixAddr("unix", socksPath)
if err != nil{
panic(err)
}
// 连接UnixSock
conn, err := net.DialUnix("unix", nil, raddr)
if err != nil{
panic(err)
}
// 发送msg
n, oobn, err := conn.WriteMsgUnix(nil, data, nil)
if err != nil{
panic(err)
}
fmt.Printf("WriteMsgUnix = %d, %d; want 1, %d", n, oobn, len(data))
fmt.Printf("write %d data successn", n)
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!