golang golang中的Unix over Unix域套接字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang golang中的Unix over Unix域套接字相关的知识,希望对你有一定的参考价值。

package main

import (
	"fmt"
	"net"
	"net/http"
	"os"
)

func main() {
	if len(os.Args) < 2 {
		fmt.Fprintln(os.Stderr, "usage:", os.Args[0], "/path.sock [wwwroot]")
		return
	}

	fmt.Println("Unix HTTP server")

	root := "."
	if len(os.Args) > 2 {
		root = os.Args[2]
	}

	os.Remove(os.Args[1])

	server := http.Server{
		Handler: http.FileServer(http.Dir(root)),
	}

	unixListener, err := net.Listen("unix", os.Args[1])
	if err != nil {
		panic(err)
	}
	server.Serve(unixListener)
}
package main

import (
	"context"
	"flag"
	"fmt"
	"io"
	"net"
	"net/http"
	"os"
	"strings"
)

func main() {
	post := flag.String("d", "", "data to POST")
	help := flag.Bool("h", false, "usage help")
	flag.Parse()

	if *help || len(flag.Args()) != 2 {
		fmt.Fprintln(os.Stderr, "usage:", os.Args[0], "[-d data] /path.socket /uri")
		flag.PrintDefaults()
		os.Exit(0)
	}

	fmt.Println("Unix HTTP client")

	httpc := http.Client{
		Transport: &http.Transport{
			DialContext: func(_ context.Context, _, _ string) (net.Conn, error) {
				return net.Dial("unix", flag.Args()[0])
			},
		},
	}

	var response *http.Response
	var err error
	if len(*post) == 0 {
		response, err = httpc.Get("http://unix" + flag.Args()[1])
	} else {
		response, err = httpc.Post("http://unix"+flag.Args()[1], "application/octet-stream", strings.NewReader(*post))
	}

	if err != nil {
		panic(err)
	}
	io.Copy(os.Stdout, response.Body)
}

Golang gRPC默认值

给出以下protobuf定义:

message MyMessage {
    string Foo = 1;
    int From = 2;
    int To = 3;
}

然后,我想只从客户端发送Foo字符串,没有问题。问题出现在服务器上,我想知道From和To是否具有值(UNIX时间戳)。如果客户端未明确设置该值,则Go会将值设置为0,这是完全有效的Unix时间戳。在这一点上,我不知道客户是否打算给我1970-01-01 00:00:00还是要留空。

我可以添加两个布尔值,说明客户是否设置了发件人和发件人,但是我觉得应该有一个比这更优雅的解决方案。

是否有一种方法可以真正找出客户端是否打算发送空值,或者是否将值实际设置为0?对于字符串等,""也是如此。

答案

您无法区分缺少的字段和在proto3中设置为其默认值的字段。这是设计使然。在Issue 1606中引用xfxyjwf:

  • 删除proto3中场的存在的理由:

    • proto2中的字段存在引起混乱,并且使语义变得复杂,例如一必须区分缺失字段和设置为其默认值的字段;用户通常在访问字段之前检查是否存在,这是不必要的。我们相信在大多数情况下,不需要现场状态信息。

    • 消除字段的存在使使用开放结构的Proto3更加容易实现表示形式,例如Android Java(go / nano-proto)或Go等语言。更容易实施反过来使外部实施者社区可以更好地访问它。

  • 如果明确需要此类状态信息,则有几种解决方法,例如包装,显式has_field布尔值。如果与proto2可选的向后电线兼容,也可以使用其中一个必填字段。

以上是关于golang golang中的Unix over Unix域套接字的主要内容,如果未能解决你的问题,请参考以下文章

golang 去unix信号ctrl + C.

解决unknown import path "golang.org/x/sys/unix": unrecognized import path "golang.org/x

golang的并发

golang

『Golang』—— 标准库之 os

golang语言特性