in utils.go [364:409]
func ethrDialEx(p EthrProtocol, dialAddr, localIP string, localPortNum uint16, ttl int, tos int) (conn net.Conn, err error) {
localAddr := fmt.Sprintf("%v:%v", localIP, localPortNum)
var la net.Addr
network := Tcp()
if p == TCP {
la, err = net.ResolveTCPAddr(network, localAddr)
} else if p == UDP {
network = Udp()
la, err = net.ResolveUDPAddr(network, localAddr)
} else {
ui.printDbg("Only TCP or UDP are allowed in ethrDial")
err = os.ErrInvalid
return
}
if err != nil {
ui.printErr("Unable to resolve TCP or UDP address. Error: %v", err)
return
}
dialer := &net.Dialer{
Control: func(network, address string, c syscall.RawConn) error {
return c.Control(func(fd uintptr) {
ethrSetTTL(fd, ttl)
ethrSetTOS(fd, tos)
})
},
}
dialer.LocalAddr = la
dialer.Timeout = time.Second
conn, err = dialer.Dial(network, dialAddr)
if err != nil {
ui.printDbg("ethrTCPDial Error: %v", err)
} else {
tcpconn, ok := conn.(*net.TCPConn)
if ok {
tcpconn.SetLinger(0)
}
udpconn, ok := conn.(*net.UDPConn)
if ok {
err = udpconn.SetWriteBuffer(4 * 1024 * 1024)
if err != nil {
ui.printDbg("Failed to set ReadBuffer on UDP socket: %v", err)
}
}
}
return
}