golang採用unix域通訊的echo測試程式
阿新 • • 發佈:2018-11-02
golang通過unix域可以與其他程序完成程序間通訊,做一個回顯測試demo如下:
package main import ( "fmt" "net" "bufio" "os" ) func writeUnix(listener *net.UnixConn,dstAddr *net.UnixAddr) { for { bio := bufio.NewReader(os.Stdin) buf,_,_:= bio.ReadLine() _, err := listener.WriteToUnix(buf, dstAddr) checkError(err) } } func readUnix(listener *net.UnixConn) { for { buf :=make([]byte, 1400) size, remote, err := listener.ReadFromUnix(buf) checkError(err) fmt.Println("recv:", string(buf[:size]), " from ", remote.String()) } } func checkError(err error) { if err != nil { fmt.Printf("Error: %s\n", err.Error()) os.Exit(1) } } func runUnix() { addr, err := net.ResolveUnixAddr("unixgram", "/tmp/unix_gram_sock2") checkError(err) listener, err := net.ListenUnixgram("unixgram", addr) defer listener.Close() checkError(err) //send to its subs go readUnix(listener) go writeUnix(listener,addr) select{} } func main(){ runUnix() }
其中核心api是ListenUnixgram, ReadFromUnix, WriteToUnix.與之前的UDP的api類似,應用於程序間通訊,像UDP那樣靈活的設計介面,而沒有連線,同時必須有client和server兩個地址,便於接收資料.
通過"/tmp/unix_gram_sock2"的內部socket,就可以與其他程序高效的通訊了,由於是unix域內通訊,不用考慮丟包的問題.由於是UDP通訊,不用考慮粘包和半包的問題.