go - 如何使用 TCP 连接来自相同源 ip 和端口的不同主机

标签 go tcp

我想在一个进程和其他已经在监听传入 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_REUSEADDRSO_REUSEPORT允许但未标准化,并且似乎在验证特定负载密集型场景下使用。

这将有助于了解您为什么要实现这样的设置。

补充:有一个与您的问题相关的stackoverflow问题:TCP: can two different sockets share a port?

关于go - 如何使用 TCP 连接来自相同源 ip 和端口的不同主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59011605/

相关文章:

go - 像 Django 一样在文件更改时重新启动 Go 的 net/http 服务器

go - 类型转换运算符重载为 'GO' 中的全局函数

c - Linux 内核 lock_sock 函数

c - 在 C 中使用第二次调用 send() 时出现问题

java - 在没有服务器的情况下建立平等客户端的双向 TCP 通信的最佳方法是什么?

戈朗 : How to terminate/abort/cancel inbound http request without response?

Go using mux Router - 如何将我的数据库传递给我的处理程序

unit-testing - 模拟 go-logr 并验证它记录的消息?

parsing - 带有 HTTP 数据的 TCP 段

c++ - 用于构建 Web 协议(protocol)的资源