Wednesday, August 20, 2014

Doing a setsockopt in Go

Sorry, this is in the wrong blog, but I don't have one for Go/Golang.

Anyway, wanted to do a setsockopt() in Go on a socket I had created. There were a few posts on this, but none that worked too well for me, so here is what I did. Hope others can benefit from it.

Want to thank Rick (Richard Spillane) for his suggestions on introspection in Go.

In my case, I wanted to bind a socket I had created to a particular interface. Here is the code:

func bindToIf(conn net.Conn, interfaceName string) {
        ptrVal := reflect.ValueOf(conn)
        val := reflect.Indirect(ptrVal)
        //next line will get you the net.netFD
        fdmember := val.FieldByName("fd")
        val1 := reflect.Indirect(fdmember)                                   
        netFdPtr := val1.FieldByName("sysfd")                                           
        fd := int(netFdPtr.Int())
        //fd now has the actual fd for the socket
        err := syscall.SetsockoptString(fd, syscall.SOL_SOCKET,
                    syscall.SO_BINDTODEVICE, interfaceName)
        if err != nil {
            log.Fatal(err)
        }
}


I pulled this code out from some other code, so there might be some formatting errors, but this does work with go 1.2.1 on a Linux machine.