go - 在 TCP 连接的端口上发送 UDP 数据包

标签 go udp

关闭。这个问题需要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.TCPConnnet.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()

然后假设这个客户端也是一个服务器并监听端口 UDP1234
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/

相关文章:

go - http和默认servermux之间的区别?

go - 以编程方式确定是否在 revel 框架中生产

c++ - 使用 C++ 将 UDP 数据包存储在结构中

java - Java 中的事件传递库?

go - 数据库Golang保存错误

Go无法访问其他文件中的导出数据

google-app-engine - 访问数据存储时如何避免 "safety"over quota panic? (已启用计费)

java - TimerTask 中的 NetworkOnMainThreadException

tcp - TCP和UDP的区别?

debugging - 跟踪程序的 TCP/UDP 连接