golang AF_UNIX 操作

创作人 Leo


编辑时间 Sun Nov 29,2020 at 09:30


golang AF_UNIX 操作

AF_UNIX - 类 unix 操作系统通过管道文件进行数据交互,和 AF_INET 同样属于一种通信手段
该通信手段用于本机多个进程之间交互,比如cli命令行程序与其对应的守护进程通信

服务端

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"os"
)

func main() {
	var err error

	socketFile := "../UnixFDTest.sock"
	err = os.Remove(socketFile)
	if err!=nil {
		fmt.Println("remove "+ socketFile+" failed")
	}

	webEngine := gin.New()
	webEngine.Use(gin.Logger(), gin.Recovery())
	webEngine.Handle("GET", "/test", func(context *gin.Context) {
		context.JSON(http.StatusOK, map[string]interface{}{
			"msg":"hello world" ,
		})
	})

	err = webEngine.RunUnix(socketFile)
	if err!=nil {
		panic(err)
	}
}

客户端

package main

import (
	"context"
	"fmt"
	"io/ioutil"
	"net"
	"net/http"
)

func main() {
	sockFile := "../UnixFDTest.sock"
	addr := &net.UnixAddr{Name: sockFile, Net: "unix"}

	unixDial := func(_ context.Context, _ string, _ string) (conn net.Conn, err error) {
		conn, err = net.DialUnix("unix", nil, addr)
		return
	}
	client := &http.Client{Transport: &http.Transport{
		DialContext: unixDial,
	}}
	resp, err := client.Get("http://localhost/test")
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(resp.StatusCode)

		result,err := ioutil.ReadAll(resp.Body)
		if err != nil {
			panic(err)
		}

		fmt.Println("http response ", string(result))
	}
}

阅读:768
搜索
  • Linux 高性能网络编程库 Libevent 简介和示例 2678
  • web rtc 学习笔记(一) 2591
  • react 学习笔记(一) 2490
  • Mac系统编译PHP7【20190929更新】 2388
  • zksync 和 layer2 2367
  • Hadoop Map Reduce 案例:好友推荐 2287
  • Hadoop 高可用集群搭建 (Hadoop HA) 2275
  • 小白鼠问题 2211
  • Linux 常用命令 2176
  • 安徽黄山游 2152
简介
不定期分享软件开发经验,生活经验