Go入门笔记-23 unix域套接字通讯
UNIX域套接字(UDS):UNIX Domain Socket
UNIX域socket实现本地进程间通信,需要一个进程作为服务器端,一个进程作为客户端。与网络编程最不一样的地方是服务器端bind的时候用的是sockaddr_un结构,客户端connect的时候用的也是sockaddr_un结构,而不是sockaddr_in或sockaddr。而对于sockaddr_un结构,重点是给它提供一个bind()函数生成的socket类型文件的路径,即sockaddr_un.sun_path的值。并且客户端与服务器端的这个sockaddr_un结构的sun_path是一致的。
1、服务端示例代码
/* server.go */
package main
import (
"fmt"
"net"
"os"
)
func checkError(err error) {
if err != nil {
fmt.Printf("Error: %s\n", err.Error())
os.Exit(1)
}
}
func recvUnixMsg(conn *net.UnixConn) {
var buf [20]byte
n, raddr, err := conn.ReadFromUnix(buf[0:])
fmt.Println(raddr)
if err != nil {
return
}
fmt.Println("msg is ", string(buf[0:n]))
_, err = conn.WriteToUnix([]byte("nice to see u"), raddr)
checkError(err)
}
func main() {
laddr, err := net.ResolveUnixAddr("unixgram", "/tmp/unix_gram_sock")
checkError(err)
conn, err := net.ListenUnixgram("unixgram", laddr)
checkError(err)
recvUnixMsg(conn)
}
1、客户端示例代码
package main
import (
"fmt"
"net"
"os"
)
func checkError(err error) {
if err != nil {
fmt.Printf("Error: %s\n", err.Error())
os.Exit(1)
}
}
func main() {
raddr, err := net.ResolveUnixAddr("unixgram", "/tmp/unix_test_sock")
checkError(err)
laddr, err := net.ResolveUnixAddr("unixgram", "/tmp/unix_test_sock_cli")
checkError(err)
conn, err := net.DialUnix("unixgram", laddr, raddr)
checkError(err)
defer conn.Close()
if err != nil {
os.Exit(1)
}
n, err := conn.Write([]byte("Hello world"))
fmt.Printf("send msg n:%d\n", n)
var msg [20]byte
conn.Read(msg[0:])
fmt.Println("msg is", string(msg[0:10]))
}
3、执行结果
服务端

如果重复启动服务端的话,会报下面错误,需要先rm sock文件后再启动

客户端

本博客是个人工作中记录,更深层次的问题可以提供有偿技术支持。
另外建了几个QQ技术群:
2、全栈技术群:616945527
2、硬件嵌入式开发: 75764412
3、Go语言交流群:9924600
闲置域名WWW.EXAI.CN (超级人工智能)出售。
另外建了几个QQ技术群:
2、全栈技术群:616945527
2、硬件嵌入式开发: 75764412
3、Go语言交流群:9924600
闲置域名WWW.EXAI.CN (超级人工智能)出售。

浙公网安备 33010602011771号