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号