package socket
import (
"errors"
"net"
"os"
"syscall"
)
type Conn struct {
network string
c syscall .RawConn
}
type tcpConn interface {
SyscallConn() (syscall .RawConn , error )
SetLinger(int ) error
}
var _ tcpConn = (*net .TCPConn )(nil )
type udpConn interface {
SyscallConn() (syscall .RawConn , error )
ReadMsgUDP(b, oob []byte ) (n, oobn, flags int , addr *net .UDPAddr , err error )
}
var _ udpConn = (*net .UDPConn )(nil )
type ipConn interface {
SyscallConn() (syscall .RawConn , error )
ReadMsgIP(b, oob []byte ) (n, oobn, flags int , addr *net .IPAddr , err error )
}
var _ ipConn = (*net .IPConn )(nil )
func NewConn (c net .Conn ) (*Conn , error ) {
var err error
var cc Conn
switch c := c .(type ) {
case tcpConn :
cc .network = "tcp"
cc .c , err = c .SyscallConn ()
case udpConn :
cc .network = "udp"
cc .c , err = c .SyscallConn ()
case ipConn :
cc .network = "ip"
cc .c , err = c .SyscallConn ()
default :
return nil , errors .New ("unknown connection type" )
}
if err != nil {
return nil , err
}
return &cc , nil
}
func (o *Option ) get (c *Conn , b []byte ) (int , error ) {
var operr error
var n int
fn := func (s uintptr ) {
n , operr = getsockopt (s , o .Level , o .Name , b )
}
if err := c .c .Control (fn ); err != nil {
return 0 , err
}
return n , os .NewSyscallError ("getsockopt" , operr )
}
func (o *Option ) set (c *Conn , b []byte ) error {
var operr error
fn := func (s uintptr ) {
operr = setsockopt (s , o .Level , o .Name , b )
}
if err := c .c .Control (fn ); err != nil {
return err
}
return os .NewSyscallError ("setsockopt" , operr )
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .