【发布时间】:2011-12-09 15:56:32
【问题描述】:
我正在编写一个小型应用程序,其中包括在 Linux(Posix 套接字)中实现的用于 P2P 通信的 UDP 打孔。 到目前为止它运行良好,但传入的数据包确实存在问题。
在两个客户端收到各自客户端的对等信息后,它们开始发送 UDP 数据包以在其防火墙上打洞。
我的问题出现了:在发送“HolePunching-Packet”之后,客户端监听(rcv)传入的数据包。如果客户端收到“HolePunching-Packet”,则打孔过程成功停止,用户可以开始接收/发送用户数据。
但是如果另一个客户端的 HolePunching-Packet 被客户端防火墙占用,这个包将永远不会到达 rcv-call 并且当前线程将被阻塞,直到下一个用户数据“唤醒”客户端,但这特定数据包正在被打孔进程消耗,无法转发给用户。
所以我正在寻找任何方法将第一个收到的 udp 数据包放回系统的接收缓冲区。我不能使用自己的 (char) 缓冲区作为项目约束,如果无法使用 posix-methods 实现这一点,则必须找到解决方法。
你们知道在 Posix 系统中执行此操作的任何方法吗?
这是我的应用程序如何工作的粗略架构:
SocketClass
{
Punching
{
send(Give me the IP:PORT of Client2)
recv(Peerinformation)
send(HolePunchingPacket to client2)
recv(HolePunchingPacket from client2 or userdata)
if (recvedPacket != HolePunching-Packet)
put_back_in_recvbuffer(recvedPacket)
done
}
UserCode
{
[...]
}
}
【问题讨论】:
标签: linux sockets udp posix buffer