我正在尝试使用golang中的ssh port-forwarding连接到两个远程mongodb服务器,我的graphql服务器使用它来进行查询。两个隧道的中间主机是相同的。所以假设中间主机是123.45.678.678,两个远程mongodb服务器是1.23.45.67和1.23.45.78,我创建这样的隧道,
conn, err := ssh.Dial("tcp", 123.45.678.678, config)
if err != nil {
panic(err)
}
remote1, err := conn.Dial("tcp", "1.23.45.67:27017")
if err != nil {
panic(err)
}
remote2, err := conn.Dial("tcp", "1.23.45.78:27017")
if err != nil {
panic(err)
}
local1, err := net.Listen("tcp", "localhost:27018")
if err != nil {
panic(err)
}
local2, err := net.Listen("tcp", "localhost:27019")
if err != nil {
panic(err)
}
现在我将流量从local1转发到remote1,将local2转发到remote2,就像这样
go func() {
for {
l, err := local1.Accept()
if err != nil {
panic(err)
}
go func() {
_, err := io.Copy(l, remote1)
if err != nil {
panic(err)
}
}()
go func() {
_, err := io.Copy(remote1, l)
if err != nil {
panic(err)
}
}()
}
}()
go func() {
for {
l, err := local2.Accept()
if err != nil {
panic(err)
}
go func() {
_, err := io.Copy(l, remote2)
if err != nil {
panic(err)
}
}()
go func() {
_, err := io.Copy(remote2, l)
if err != nil {
panic(err)
}
}()
}
}()
我使用mgo.Dial创建两个mongo会话,并在调用此函数时将这两个会话导出到graphql。对于需要两个会话的一些查询(不是所有查询,只有一些复杂的查询),我看到写:破坏管道错误
panic: readfrom tcp 127.0.0.1:27019->127.0.0.1:53128: write tcp 127.0.0.1:27019->127.0.0.1:53128: write: broken pipe
当我调试这个时,我发现在上面的代码片段中l和remote2之间发生io.copy时会发生这个错误,我想这是因为remote2隧道断开连接。
tcpdump显示中间主机在一段时间之后将结束标志发送到remote2服务器,这导致终止连接。我想知道如何解决这个问题。