如何制作unix socket监听器

时间:2014-05-19 21:50:21

标签: go

这实际上是一个更基本的成语问题,但这是一个很好的例子。 (BTW 100%go newb)

尝试侦听unix套接字并处理消息。来自各个地方的被盗代码,但我不能投出#39;事情正确

package main

import "fmt"
import "net"

func main(){
    ln,err := net.Listen("unix", "/var/service/daemon2")
    if err!= nil {
        fmt.Println(err)
        return
    }

    for {
        c, err := ln.Accept()
        if err != nil {
            fmt.Println(err)
            continue
        }
    // handle the connection
        go handleServerConnection(c)
    }


}

func handleServerConnection(c net.UnixConn) {
    // receive the message
    buff := make([]byte, 1024)
    oob := make([]byte, 1024)

    _,_,_,_,err:=c.ReadMsgUnix(buff,oob);
    if err != nil {
        fmt.Println(err)

    }
}

我需要' c'在handleServerConnection里面是UNixConn类型,所以我可以调用ReadUNixMsg。但是通用的Listen代码构成了一个通用的Conn对象。所以这段代码没有编译。

我尝试了各种转换/转换类型的东西UnixConn(c),但都无济于事。

3 个答案:

答案 0 :(得分:7)

像这样建立连接:

 go handleServerConnection(c.(*net.UnixConn))

并将函数的签名更改为:

func handleServerConnection(c *net.UnixConn) {

这里发生的是net.Listen返回一个Listener接口,所有侦听器套接字都会实现该接口。实际对象是指向net.UnixConn的指针,它实现Listener接口。这允许您进行类型断言/转换。如果对象实际上不是unix套接字,那么这当然会失败,所以你最好先验证断言。

以下是您需要了解的内容:http://golang.org/doc/effective_go.html#interface_conversions

答案 1 :(得分:2)

您要找的是将net.Listen替换为net.ListenUnixgram("unix", net.ResolveUnixAddr("unix","/path/to/socket"),这将返回您想要的net.UnixConn对象。

答案 2 :(得分:0)

或者您可以使用net.ListenUnix()返回一个UnixListener,您可以在其上调用AcceptUnix,它返回一个* net.UnixConn。

但Not_a_Golfer解决方案工作正常:)