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 (超级人工智能)出售。