You can write it by yourself. Here is my code:
func TcpDial(localAddress string, remoteAddress string, timeout
time.Duration) (*net.TCPConn, error) {
timer := time.NewTimer(timeout)
defer timer.Stop()
type Result struct {
*net.TCPConn
error
}
channel := make(chan *Result, 1)
go func() {
var localAddr, remoteAddr *net.TCPAddr
var err error
var tcpConn *net.TCPConn
if localAddress != "" {
localAddr, err = net.ResolveTCPAddr("tcp", localAddress)
if err != nil {
goto finished
}
}
remoteAddr, err = net.ResolveTCPAddr("tcp", remoteAddress)
if err != nil {
goto finished
}
tcpConn, err = net.DialTCP("tcp", localAddr, remoteAddr)
if err != nil {
goto finished
}
finished:
channel <- &Result{TCPConn: tcpConn, error: err}
}()
select {
case <-timer.C:
return nil, errors.New("connect timeout")
case result := <-channel:
if result.error != nil {
return nil, result.error
}
return result.TCPConn, nil
}
panic("unreachable")
--
Best regards,
Jingcheng Zhang
Beijing, P.R.China