- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一个小型应用程序,其中包括在 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/
我有一个问题,我在我的 C++ 程序中错误的时间得到一个 int 作为输入,所以我需要稍后在 cin 上“放回”。然而,我能找到的最接近于执行此操作的是 istream 的推回功能。遗憾的是,这仅适用
当工具栏被拖离 GUI 然后关闭(将其返回到 GUI)时,为什么这段代码会抛出 IllegalArgumentException? 我能理解为什么在没有约束的情况下添加组件可能是不合适的,但在这种情况
我是一名优秀的程序员,十分优秀!