gpt4 book ai didi

linux - 如何将udp数据包放回接收缓冲区

转载 作者:太空宇宙 更新时间:2023-11-04 09:53:24 26 4
gpt4 key购买 nike

我正在编写一个小型应用程序,其中包括在 Linux 中实现的用于 P2P 通信的 UDP 打洞(Posix 套接字)。到目前为止它运行良好,但我确实遇到了传入数据包的问题。

在两个客户端收到各自客户端的对等信息后,他们开始发送 UDP 数据包以在防火墙中打洞。

我的问题出现了:在发送“HolePunching-Packet”后,客户端监听 (rcv) 传入的数据包。如果客户端收到“HolePunching-Packet”,则打洞过程已成功停止,用户可以开始接收/发送用户数据。

但是如果另一个客户端的 HolePunching-Packet 被客户端防火墙占用,这个数据包将永远不会到达 rcv-call 并且当前线程将被阻塞直到下一个用户数据“唤醒”客户端,但是这个特定数据包正在被打洞过程消耗,无法转发给用户。

所以我正在寻找任何方法将第一个收到的 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) 一起使用在您的“打洞”过程中,然后仅在需要时才对数据进行出队处理,但老实说,这看起来很麻烦。为什么不为您的进程实现一个干净的状态机,并根据状态将数据包转发到适当的代码路径?

关于linux - 如何将udp数据包放回接收缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8448111/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com