我正在编写一个小应用程序,其中包括在Linux(Posix Sockets)中实现的用于P2P通信的UDP打孔。
到目前为止,它工作得很好,但我确实对传入的数据包有问题。
在两个客户端接收到各自客户端的对等信息后,它们开始发送UDP数据包以在防火墙上打洞。
这里我的问题突然出现了:在发送“HolePunching Packet”之后,客户端监听(rcv)传入的数据包。如果客户端接收到“HolePunching包”,则穿孔过程将成功停止,用户可以开始接收/发送用户数据。
但是,如果另一个客户端的HolePunching包被客户端防火墙持有,那么这个包将永远无法到达rcv调用,当前线程将被阻塞,直到下一个用户数据“唤醒”客户端,但是这个pertical包正在被穿孔过程消耗,不能被中继到用户。
所以我正在寻找任何方法将第一个接收到的udp包放回系统的接收缓冲区。我不能将自己的(char)缓冲区用作项目约束,如果无法使用posix方法实现这一点,则必须找到解决方法。
你们知道在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
    {
       [...]
    }
}

最佳答案

在“打孔”过程中,可以将MSG_PEEK标志与recv(2)一起使用,然后只在需要时取消数据队列,但老实说,这看起来像一个kludge。为什么不为您的进程实现一个干净的状态机,并根据状态将数据包转发到适当的代码路径?

08-18 19:18
查看更多