Go Localhost UDP客户端未从UDP代理接收数据包
我有一个代理,在Minecraft(Windows10Edition)客户端和服务器之间运行,协议是UDP。客户端广播一个未连接的ping,然后服务器用一个未连接的pong应答,一切正常。问题是,当服务器将数据包发送到我的代理时,我的代理将数据包发送到客户端,但由于某种原因,在这一部分发生了一些事情;我的代理没有发送数据包,或者客户端没有接收数据包,但很可能是第二种选择 编辑:我让未连接的ping和pong正常工作,现在服务器在服务器列表上显示为在线,现在问题主要是打开的连接请求/回复。我是如何让乒乓球和乒乓球工作的,是我重新编码了缓冲区并发送它们,而不是原始发送 在这里,您可以从wireshark看到,minecraft客户端向代理发送未连接的ping:Go Localhost UDP客户端未从UDP代理接收数据包,go,udp,minecraft,datagram,raknet,Go,Udp,Minecraft,Datagram,Raknet,我有一个代理,在Minecraft(Windows10Edition)客户端和服务器之间运行,协议是UDP。客户端广播一个未连接的ping,然后服务器用一个未连接的pong应答,一切正常。问题是,当服务器将数据包发送到我的代理时,我的代理将数据包发送到客户端,但由于某种原因,在这一部分发生了一些事情;我的代理没有发送数据包,或者客户端没有接收数据包,但很可能是第二种选择 编辑:我让未连接的ping和pong正常工作,现在服务器在服务器列表上显示为在线,现在问题主要是打开的连接请求/回复。我是如何
NO. Time. Source. Dest. Proto. Len. Packet
417 10.452413 10.0.0.248 10.0.0.255 RakNet 75 Unconnected Ping (client -> proxy)
430 10.457000 10.0.0.248 x.x.x.x RakNet 610 Unconnected Ping (proxy -> server)
431 10.587214 x.x.x.x 10.0.0.248 RakNet 212 Unconnected Pong (server -> proxy -> client)
现在代理接收到未连接的pong,将其发送到客户端,而客户端没有接收到,我可以确认这一点,因为在游戏中服务器显示为脱机状态,并且不显示任何数据:
在我的代码中,我首先绑定端口19132上的代理,并设置要与之通信的服务器地址:
var config = NewConfig()
var proxy = Proxy{}
var err error
proxy.UDPConn, err = net.ListenUDP("udp", &net.UDPAddr{IP: net.ParseIP(config.BindAddr), Port: config.BindPort})
if err != nil {
Panic(err.Error())
os.Exit(1)
}
Info("Starting proxy on " + config.BindAddr + ":" + strconv.Itoa(config.BindPort))
addrs, err := net.LookupHost(config.ServerAddr)
if err != nil {
Panic(err.Error())
os.Exit(1)
}
conn := NewConnection(&proxy)
conn.server.SetAddress(net.UDPAddr{IP: net.ParseIP(addrs[0]), Port: config.ServerPort})
conn.HandleIncomingPackets()
现在,我的代理开始自动接收和发送数据包
for true {
buffer := make([]byte, 2048)
_, addr, err := conn.proxy.UDPConn.ReadFromUDP(buffer)
if err != nil {
Alert(err.Error())
continue
}
MessageId := buffer[0]
Debug("Message Id : " + strconv.Itoa(int(MessageId))) // this is the packet id
if conn.client.IsConnected() { // client is connected
if conn.IsServer(*addr) {
conn.pkHandler.HandleIncomingPacket(buffer, conn.client) // if server send to client
}else{
conn.pkHandler.HandleIncomingPacket(buffer, conn.server) // if client send to server
}
} else {
switch MessageId {
case byte(IdUnconnectedPingOpenConnection):
conn.handleUnconnectedPing(*addr, buffer) // send this server
break
case byte(IdUnconnectedPongOpenConnection):
conn.handleUnconnectedPong(*addr, buffer) // parse server data and send to client
break
case byte(IdOpenConnectionRequest1):
conn.handleConnectionRequest1(*addr, buffer) // connect client and send to server
break
//case byte(IdOpenConnectionReply1):
// conn.handleConnectionReply1(*addr, buffer)
// break
}
}
}
这是消息id日志:
[2018-06-10 13:52:12][Log/DEBUG]: Message Id : 1
[2018-06-10 13:52:12][Log/INFO]: Received unconnected ping from client address: 10.0.0.248
[2018-06-10 13:52:12][Log/DEBUG]: Message Id : 28
[2018-06-10 13:52:12][Log/INFO]: Received unconnected pong from server address: x.x.x.x
[2018-06-10 13:52:13][Log/DEBUG]: Message Id : 1
[2018-06-10 13:52:13][Log/INFO]: Received unconnected ping from client address: 10.0.0.248
[2018-06-10 13:52:13][Log/DEBUG]: Message Id : 28
[2018-06-10 13:52:13][Log/INFO]: Received unconnected pong from server address: x.x.x.x
我确认客户端未接收数据包的另一种方式是,在游戏中我单击服务器列表中的服务器时,客户端发送一个打开连接请求1(5)
,服务器回复打开连接回复1(6)
,客户端应该接收到该请求并继续执行开放连接请求2(7)
,然后服务器最终回复开放连接回复2(8)
,但客户端从未发送开放连接请求2(7)
,因为它从未收到开放连接回复1(6)
从代理服务器发送,并因此超时和断开连接,下面是一个日志,其中显示:
[2018-06-10 11:07:46][Log/DEBUG]: Message Id : 5
[5 0 255 255 0 254 254 254 254 253 253 253 253 18 52 86 120 8]
[2018-06-10 11:07:47][Log/DEBUG]: Message Id : 6
[6 0 255 255 0 254 254 254 254 253 253 253 253 18 52 86 120 36 149 162 237 197 55 226 161 0 8 28]
[2018-06-10 11:07:47][Log/DEBUG]: Message Id : 5
[5 0 255 255 0 254 254 254 254 253 253 253 253 18 52 86 120 8]
[2018-06-10 11:07:47][Log/DEBUG]: Message Id : 6
[6 0 255 255 0 254 254 254 254 253 253 253 253 18 52 86 120 36 149 162 237 197 55 226 161 0 8 28]
[2018-06-10 11:07:47][Log/DEBUG]: Message Id : 1
[1 0 0 0 0 3 3 91 191 0 255 255 0 254 254 254 254 253 253 253 253 18 52 86 120 191 216 14 215 31 123 8 249]
经过这么多的调试和测试,我想我只需要继续发送数据报缓冲区,如果数据报缓冲区来自服务器,则将其发送到客户端,反之亦然。如果我取消了数据包的发送,我需要发送一个ACK。事情就这么简单