【问题标题】:How to put back udp packet in the receivebuffer如何将 udp 数据包放回接收缓冲区
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 我也考虑过一个状态机,但是因为我只是一个接一个地读取一个数据包来检查数据包的类型,这将需要更多时间来完成我的请求 - 我将尝试 MSG_PEEK(我怎么能甚至忘记这个选项?!)并报告:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多