能否同个端口同时和多个服务器 IP:端口建立 TCP 链接

341 天前
 8520ccc

我知道,理论上,原理上一定能实现

因为四元祖是:server ip port client ip port

那么,有没有支持这个功功能得系统或者方案呢?

最好是 GO 能用的

1728 次点击
所在节点    问与答
11 条回复
serafin
341 天前
理论不行。 在 TCP 协议中,一个端口只能绑定到一个服务器 IP:端口组合。除非你说的同时是快速轮训不同的服务器 IP:端口组合,达到看上去同时的效果。
zealic
341 天前
现成方案没有,可以基于 gvisor 重写 tcp netstack ,实现 Reverse Dial

https://github.com/google/gvisor/tree/master/pkg/tcpip
d7b3e8c0094870b9
340 天前
package main

import (
"fmt"
"net"
"sync"
)

func connectToServer(serverAddr string, wg *sync.WaitGroup) {
defer wg.Done()

// 与服务器建立连接
conn, err := net.Dial("tcp", serverAddr)
if err != nil {
fmt.Printf("Cannot connect to server %s: %v\n", serverAddr, err)
return
}
defer conn.Close()

fmt.Printf("Connected to server: %s\n", serverAddr)
// 这里可以添加与服务器通信的代码
// ...
}

func main() {
var wg sync.WaitGroup

// 服务器 1 地址
server1 := "server1:8080"
// 服务器 2 地址
server2 := "server2:8080"

// 同时建立两个连接
wg.Add(2)
go connectToServer(server1, &wg)
go connectToServer(server2, &wg)

// 等待所有 Goroutines 完成
wg.Wait()

fmt.Println("Both connections established")
}
Citrus
340 天前
目前常用的 TCP 协议栈实现应该都没做这个支持,参考 @zealic 的回答自己实现协议栈吧。
@serafin 理论可以的,TCP 协议栈的定义是支持的。只是实现支不支持另说。
@d7b3e8c0094870b9 GPT 生成的?你有仔细看要求么。。。
lovelylain
340 天前
bind 不同端口然后用 iptables snat 到同一个端口吧
opengps
340 天前
只要求同一个端口发出,那你可以尝试变化本地 ip ,这就要求你本地网卡有多 ip
sky96111
340 天前
mtw
340 天前
用 C 语言写很简单,理论上 go 语言也可以的。
skyqqcc581
340 天前
@d7b3e8c0094870b9 Cannot connect to server baidu.com: dial tcp 0.0.0.0:9999->:80: bind: address already in use
Connected to server: qq.com
Both connections established 这个完全不可行
skyqqcc581
340 天前
@opengps 公网 IP 时 IP 要钱的
skyqqcc581
340 天前
@sky96111 thanks 在 ubuntu 上测试成功了

```
package main

import (
"log"

reuse "github.com/libp2p/go-reuseport"
)

func main() {
l2, err := reuse.Dial("tcp", "0.0.0.0:1234", "baidu.com:80")
l3, err1 := reuse.Dial("tcp", "0.0.0.0:1234", "qq.com:80")
log.Println(err, err1)
log.Println(l2.LocalAddr())
log.Println(l3.LocalAddr())
if err == nil {
l2.Close()
}
if err1 == nil {
l3.Close()
}
}

```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1009214

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX