search.png
关于我
menu.png
mysql sock 文件

mysql sock 文件

mysql.sock 是 mysql 的客户端和服务端在同一台服务器上时,使用 unix domain socket 作为通讯协议的载体,它比tcp快。

需要 mysqld 的守护进程启动。这个 sock 文件才存在。

使用 sock 无需指定具体的 IP 和端口。

mysql -S mysql.sock -p  # -p 输入密码

什么是 unix domain socket

Unix domain socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信。socket 原本是为网络通讯设计的,但后来在 socket 的框架上发展出一种 IPC 机制,就是 UNIX domain socket。虽然网络 socket 也可用于同一台主机的进程间通讯(通过 loopback 地址 127.0.0.1),但是 UNIX domain socket 用于 IPC 更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。这是因为,IPC 机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。
UNIX domain socket 是全双工的,API 接口语义丰富,相比其它 IPC 机制有明显的优越性,目前已成为使用最广泛的 IPC 机制,比如 X Window 服务器和 GUI 程序之间就是通过 UNIX domain socket 通讯的。
Unix domain socket 是 POSIX 标准中的一个组件,所以不要被名字迷惑,linux 系统也是支持它的。

Go 使用 unix domain socket

https://blog.csdn.net/samxx8/article/details/73647910

// author songaimin@outlook.com 20170623
// golang 使用unixsocket交换数据
// 单元测试示例:
// package utils

// import (
//  "fmt"
//  u "lpaiche.com/utils"
//  // "os"
//  "testing"
//  "time"
// )

// func TestServer(t *testing.T) {
//  //声明unixsocket
//  us := u.NewUnixSocket("/tmp/us.socket")
//  //设置服务端接收处理
//  us.SetContextHandler(func(context string) string {
//      fmt.Println(context)
//      now := time.Now().String() + "sssssss"
//      return now
//  })
//  //开始服务
//  go us.StartServer()
//  time.Sleep(time.Second * 30)
// }

// func TestClient(t *testing.T) {
//  //声明unixsocket
//  us := u.NewUnixSocket("/tmp/us.socket")
//  //发送数据unixsocket并返回服务端处理结果
//  r := us.ClientSendContext("eeeeeee")
//  fmt.Println("===============" + r)
// }

package utils

import (
    "fmt"
    "net"
    "os"
    "time"
)

type UnixSocket struct {
    filename string
    bufsize  int
    handler  func(string) string
}

func NewUnixSocket(filename string, size ...int) *UnixSocket {
    size1 := 10480
    if size != nil {
        size1 = size[0]
    }
    us := UnixSocket{filename: filename, bufsize: size1}
    return &us
}

func (this *UnixSocket) createServer() {
    os.Remove(this.filename)
    addr, err := net.ResolveUnixAddr("unix", this.filename)
    if err != nil {
        panic("Cannot resolve unix addr: " + err.Error())
    }
    listener, err := net.ListenUnix("unix", addr)
    defer listener.Close()
    if err != nil {
        panic("Cannot listen to unix domain socket: " + err.Error())
    }
    fmt.Println("Listening on", listener.Addr())
    for {
        c, err := listener.Accept()
        if err != nil {
            panic("Accept: " + err.Error())
        }
        go this.HandleServerConn(c)
    }

}

//接收连接并处理
func (this *UnixSocket) HandleServerConn(c net.Conn) {
    defer c.Close()
    buf := make([]byte, this.bufsize)
    nr, err := c.Read(buf)
    if err != nil {
        panic("Read: " + err.Error())
    }
    // 这里,你需要 parse buf 里的数据来决定返回什么给客户端
    // 假设 respnoseData 是你想返回的文件内容
    result := this.HandleServerContext(string(buf[0:nr]))
    _, err = c.Write([]byte(result))
    if err != nil {
        panic("Writes failed.")
    }
}

func (this *UnixSocket) SetContextHandler(f func(string) string) {
    this.handler = f
}

//接收内容并返回结果
func (this *UnixSocket) HandleServerContext(context string) string {
    if this.handler != nil {
        return this.handler(context)
    }
    now := time.Now().String()
    return now
}

func (this *UnixSocket) StartServer() {
    this.createServer()
}

//客户端
func (this *UnixSocket) ClientSendContext(context string) string {
    addr, err := net.ResolveUnixAddr("unix", this.filename)
    if err != nil {
        panic("Cannot resolve unix addr: " + err.Error())
    }
    //拔号
    c, err := net.DialUnix("unix", nil, addr)
    if err != nil {
        panic("DialUnix failed.")
    }
    //写出
    _, err = c.Write([]byte(context))
    if err != nil {
        panic("Writes failed.")
    }
    //读结果
    buf := make([]byte, this.bufsize)
    nr, err := c.Read(buf)
    if err != nil {
        panic("Read: " + err.Error())
    }
    return string(buf[0:nr])
}

版权声明

知识共享许可协议 本文章由作者“衡于墨”创作,转载请注明出处,未经允许禁止用于商业用途

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
发布时间:2022年08月05日 09:47:11

评论区#

还没有评论哦,期待您的评论!

关闭特效