关闭。这个问题需要details or clarity .它目前不接受答案。
想改善这个问题吗?通过 editing this post 添加详细信息并澄清问题.
3年前关闭。
Improve this question
我有一个 Golang TCP 服务器,即 net.TCPConn
, 连接在一个端口上,除了 TCP 流之外,它还必须接收 UDP 数据包并以 UDP 数据包进行响应。传入的 UDP 数据包在服务器上弹出(来自 net.TCPConn.Read()
),但我不知道如何再次发回 UDP 数据包。所有 UDP 写入方法仅适用于 net.UDPConn
. net.UDPConn.WriteMsgUDP()
诱人地谈论它是应用于连接的还是非连接的套接字,但我不知道如何派生 net.UDPConn
来自 net.TCPConn
;我试过类型转换 net.TCPConn
至 net.UDPConn
但这会引起 panic 。
这样做的正确方法是什么?
仅供引用,我确实在同一个端口上打开了一个 UDP 监听器(因为另一端的客户端可以选择在完全无连接模式下运行)但是因为当套接字连接时,UDP 数据包到达 TCP 服务器而不是UDP 服务器,我想将 UDP 响应发送回同一个洞,而不是必须以某种邪恶的方式将两者混合在一起。或者不圣洁就是答案?
编辑:关于系统设计的一句话:这个 UDP 数据包的目的是测试这个套接字上的连接(服务器简单地回显它)。套接字是 [希望] 建立的 SSH 端口转发隧道,因此我不想使用另一个套接字,因为这不会测试我要测试的内容(即套接字和 SSH 隧道都打开; SSH 端口转发隧道的一个缺点是,由于应用程序与 localhost
建立了连接,套接字将立即报告已连接,即使当时服务器实际上并未连接)。否则 SSH 隧道承载 TCP 流量流,我特别想为此使用 UDP,因为我不希望我的 UDP 连接测试卡在 TCP 流量队列后面;时间在这个应用程序中很重要,UDP 数据包携带时间戳来测量它。 Sending a UDP packet on a connected socket是一个有效的套接字操作,Go 必须有办法做到这一点......?
最佳答案
如果您只想将 UDP 数据包发送到首先通过 TCP 到达您的应用程序的“客户端”,那么您可能可以获取远程 address :
addr = net.TCPConn.RemoteAddr()
然后假设这个客户端也是一个服务器并监听端口
UDP
在 1234
ServerAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:1234", addr))
然后你可以通过执行以下操作来回写:
conn, err := net.DialUDP("udp", nil, ServerAddr)
if err != nil {
log.Fatal(err)
}
defer close(conn)
buf := []byte("ping")
_, err = conn.Write(buf)
不知道这是否正是您想要的,但希望可以给您更多的想法。
关于go - 在 TCP 连接的端口上发送 UDP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49825924/