zoukankan      html  css  js  c++  java
  • 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
    ", 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
    ", 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)
    
    	var msg [20]byte
    	conn.Read(msg[0:])
    
    	fmt.Println("msg is", string(msg[0:10]))
    }
    

    3、执行结果

    服务端

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

    客户端

      

    本博客是个人工作中记录,遇到问题可以互相探讨,没有遇到的问题可能没有时间去特意研究,勿扰。
    另外建了几个QQ技术群:
    2、全栈技术群:616945527,加群口令abc123
    2、硬件嵌入式开发: 75764412
    3、Go语言交流群:9924600

    闲置域名www.nsxz.com出售(等宽等高字符四字域名)。
  • 相关阅读:
    使用vue-cookies操作cookie
    JavaScript如何友好的操作的cookie
    揭秘——TCP的三次握手和四次挥手
    python学习之【第八篇】:Python中的函数基础
    python学习之【第七篇】:Python中的集合及其所具有的方法
    python学习之【第六篇】:Python中的字典及其所具有的方法
    php判断是不是手机端访问
    php判断浏览器还是微信打开
    php无限极分类方法
    javascript/jquery获取url地址栏参数的方法
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/15166753.html
Copyright © 2011-2022 走看看