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出售(等宽等高字符四字域名)。
  • 相关阅读:
    Node.js github开源代码
    Node.js Base64 Encoding和Decoding
    图论500题
    gvim中的gvimrc和vimrc
    ubuntu 命令行卸载并清理软件
    vim复制到系统剪贴板
    Electron 主进程与渲染进程之间的通 信(同步通信、异步通信)
    Android 使用系统录制视频功能
    Electron 自定义软件顶部菜单、右键菜单以及绑定快捷键
    Electron remote 模块、通过 BrowserWindow 打开新窗口
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/15166753.html
Copyright © 2011-2022 走看看