我想在一个进程和其他已经在监听传入 TCP 连接的进程之间启动 TCP 连接。
我想为这些连接使用相同的源地址(ip-port)。
我正在用 Go 编程。
我尝试运行此代码,但第二次 DialTCP 调用失败。
func main() {
ourAddr, _ := net.ResolveTCPAddr("tcp", "localhost:51234")
otherAddr1, _ := net.ResolveTCPAddr("tcp", "localhost:51236")
otherAddr2, _ := net.ResolveTCPAddr("tcp", "localhost:51237")
conn1, err1 := net.DialTCP("tcp", ourAddr, otherAddr1)
if err1 != nil {
log.Fatal("err1: " + err1.Error())
}
defer conn1.Close()
conn2, err2 := net.DialTCP("tcp", ourAddr, otherAddr2) // <- this fails
if err2 != nil {
log.Fatal("err2: " + err2.Error())
}
defer conn2.Close()
}
错误信息是: err2:调用tcp 127.0.0.1:51234->127.0.0.1:51237:绑定(bind):地址已在使用
(问题不应该与目标进程有关,因为 netcat 的两个实例已经在监听目标地址)
我还尝试使用其他端口(以防它们仍在使用中)并且以同样的方式失败
这是我的版本:
go version go1.13.4 linux/amd64
在我看来,问题与 TCP 无关,而是与我使用 Go 库的方式有关。
我做错了什么,我该怎么做?
最佳答案
您面临的问题是一般问题,与 Go 编程语言无关。
据我所知,您不应该能够从相同的源 IP 地址和端口连接到两个目的地。我很确定这得到了您收到的消息的支持。
err2: dial tcp 127.0.0.1:51234->127.0.0.1:51237: bind: address already in use
它不是在提示您的目的地地址。它在提示源地址
127.0.0.1:51234
.尝试更改您的源地址,看看会发生什么。编辑:似乎有套接字选项
SO_REUSEADDR
和 SO_REUSEPORT
允许但未标准化,并且似乎在验证特定负载密集型场景下使用。这将有助于了解您为什么要实现这样的设置。
补充:有一个与您的问题相关的stackoverflow问题:TCP: can two different sockets share a port?
关于go - 如何使用 TCP 连接来自相同源 ip 和端口的不同主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59011605/