如何指定源地址,源端口发送带有timeout 的TCP请求?

xf645 · 2017-10-12 04:51:20 · 2318 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-10-12 04:51:20 的主题,其中的信息可能已经有所发展或是发生改变。

想作为一个client发起一个tcp连接,指定源地址和源端口, 同时连接带有timeout功能

我看了net库

有一个函数 func DialTimeout(network, address string, timeout time.Duration) (Conn, error)

可以实现带有timeout的tcp连接,但是它无法指定源端口,源地址

另一个函数 func DialTCP(net string, laddr, raddr TCPAddr) (TCPConn, error) 可以带有源地址,源端口,但是,却没有timeout功能

有什么办法能实现两者兼而有之? golang目前是初学者,隐约觉得可以通过为net.Dailer这个结构来指定timeout, 但是还是不会,希望有大侠能帮忙演示简单的示例代码?

谢谢了!


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2318 次点击  
加入收藏 微博
11 回复  |  直到 2017-10-12 09:40:36
caiya928
caiya928 · #1 · 8年之前

net下面不是有一个DialTimeout吗?

xf645
xf645 · #2 · 8年之前

如描述中所说,这个没法指定源地址,源port啊

marlonche
marlonche · #3 · 8年之前
addr, err := net.ResolveTCPAddr("tcp", "ip:port")
dialer := &net.Dialer{
    Timeout: xxx,
    LocalAddr: addr,
}
dialer.Dial("tcp", "dest-ip:port")
channel
channel · #4 · 8年之前
marlonchemarlonche #3 回复

addr, err := net.ResolveTCPAddr("tcp", "ip:port") dialer := &net.Dialer{ Timeout: xxx, LocalAddr: addr, } dialer.Dial("tcp", "dest-ip:port")

正解

tk103331
tk103331 · #5 · 8年之前

https://github.com/golang/go/blob/master/src/net/dial.go#L289

看下源码你就会发现,net包的Dial方法也是使用Dialer,DialTimeout只不过是设置了Dialer的timeout

xf645
xf645 · #6 · 8年之前

@marlonche 通过这种应该是没问题的,可是事实上编译它仍然会报错。 我不知道为什么会这样? 能解释一下么?

package main

import  (
    "net"
    "time"
)

func main(){

    laddr, _ := net.ResolveTCPAddr("tcp", "10.0.58.166:7001")

    d :=  &net.Dialer{
        Timeout: 2*time.Second,
        LocalAddr: laddr,
    }

    d.Dail("tcp", "10.0.8.202:80")
}
# go run 5.go
# command-line-arguments
./5.go:16:2: d.Dail undefined (type *net.Dialer has no field or method Dail)
root@sit-client-1:~/test#

我不得不采用另一种办法来实现,这种方法是采用嵌套的方式,却能成功

package main

import  (
    "net"
    "time"
)

type mydial struct{
    dialer *net.Dialer
}
func main(){
    laddr, _ := net.ResolveTCPAddr("tcp", "10.0.58.166:7001")

    d2 := mydial{}
    if  d2.dialer == nil{
        d2.dialer = &net.Dialer{}
    }
    d2.dialer.Timeout =  2*time.Second
    d2.dialer.LocalAddr = laddr
    d2.dialer.Dial("tcp", "10.0.8.202:80")
}
xf645
xf645 · #7 · 8年之前

格式全乱了.....自己的跟贴还不允许修改,删除.....

polaris
polaris · #8 · 8年之前

给你格式化了。请看看 markdown 简明教程吧 https://studygolang.com/markdown。

另外,发布前可以预览下效果

xf645
xf645 · #9 · 8年之前

@polaris 谢谢你啊

marlonche
marlonche · #10 · 8年之前

./5.go:16:2: d.Dail undefined dial这个单词确实容易拼成dail

xf645
xf645 · #11 · 8年之前

@marlonche 我都汗颜以对了... 麻烦你了

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传