我知道,理论上,原理上一定能实现
因为四元祖是:server ip port client ip port
那么,有没有支持这个功功能得系统或者方案呢?
最好是 GO 能用的
1
serafin 302 天前
理论不行。 在 TCP 协议中,一个端口只能绑定到一个服务器 IP:端口组合。除非你说的同时是快速轮训不同的服务器 IP:端口组合,达到看上去同时的效果。
|
2
zealic 302 天前 1
现成方案没有,可以基于 gvisor 重写 tcp netstack ,实现 Reverse Dial
https://github.com/google/gvisor/tree/master/pkg/tcpip |
3
d7b3e8c0094870b9 302 天前 via iPhone
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") } |
4
Citrus 302 天前 via iPhone
目前常用的 TCP 协议栈实现应该都没做这个支持,参考 @zealic 的回答自己实现协议栈吧。
@serafin 理论可以的,TCP 协议栈的定义是支持的。只是实现支不支持另说。 @d7b3e8c0094870b9 GPT 生成的?你有仔细看要求么。。。 |
5
lovelylain 302 天前 via Android
bind 不同端口然后用 iptables snat 到同一个端口吧
|
6
opengps 302 天前
只要求同一个端口发出,那你可以尝试变化本地 ip ,这就要求你本地网卡有多 ip
|
7
sky96111 302 天前 via Android
|
8
mtw 302 天前
用 C 语言写很简单,理论上 go 语言也可以的。
|
9
skyqqcc581 302 天前
@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 这个完全不可行 |
10
skyqqcc581 302 天前
@opengps 公网 IP 时 IP 要钱的
|
11
skyqqcc581 302 天前 1
@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() } } ``` |