- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我应该读取前 9 个字节,其中应包括数据包的协议(protocol)和传入大小。
当完成端口返回 9 个字节时哪个更好? (性能/良好实践或美学方面)
最佳答案
答案取决于您使用的基础架构。通常,最好的办法是什么都不做。我知道这听起来很奇怪,所以让我解释一下。当操作系统与 NIC 通信时,它通常至少有一对 RX/TX 环形缓冲区,并且在商用硬件的情况下,很可能通过 PCIe 总线与设备通信。在 PCIe 总线之上有一个 DMA 引擎,它使 NIC 可以在不使用 CPU 的情况下从主机内存读取和写入主机内存。换句话说,当 NIC 处于事件状态时,它将始终自行读取和写入数据包,而 CPU 干预最少。当然,有很多细节,但您通常可以认为在驱动程序级别上发生的事情 - 读取和写入始终由 NIC 使用 DMA 执行,无论您的应用程序是否读取/写入任何内容或不。现在,在它之上有一个操作系统基础设施,允许用户空间应用程序向 NIC 发送数据或从 NIC 接收数据。当您打开套接字时,操作系统将确定您的应用程序对哪种数据感兴趣,并在与网络接口(interface)通信的应用程序列表中添加一个条目。发生这种情况时,应用程序开始接收放置在内核中某种应用程序队列中的数据。不管你是否调用read,数据都放在那里。放置数据后,应用程序将收到通知。内核中的通知机制各不相同,但它们都有一个相似的想法——让应用程序知道数据可用于调用 read()
。一旦数据进入该“队列”,应用程序就可以通过调用 read()
来获取它。阻塞读取和非阻塞读取之间的区别很简单——如果读取是阻塞的,内核将简单地暂停应用程序的执行,直到数据到达。在非阻塞读取的情况下,控制权在任何情况下都会返回给应用程序——无论是否有数据。如果发生后者,应用程序可以继续尝试(也就是在套接字上旋转),或者等待内核通知数据可用,然后继续读取它。现在让我们回到“无所事事”。这意味着套接字被注册为只接收一次通知。注册后,应用程序无需执行任何操作,只需收到一条通知,提示“数据已存在”。所以应用程序应该做的是收听该通知并在数据存在时执行只读。一旦收到足够的数据,应用程序就可以开始以某种方式处理它。知道了所有这些,让我们看看这三种方法中哪一种更好...
Post another overlapped read on the socket, this time with the size of the packet so it receives it in the next completion?
这是一个很好的方法。理想情况下,您不必“发布”任何内容,但这取决于操作系统界面的好坏。如果您不能一次“注册”您的应用程序,然后在每次有新数据可用时继续接收通知并在新数据可用时调用 read(),那么发布异步读取请求是下一个最佳选择。
Read inside the routine the whole packet using blocking sockets and then post another overlapped with recv with 9 bytes?
如果您的应用程序完全没有其他事情可做并且您只有一个套接字可以读取,这是一种很好的方法。换句话说——这是一种简单的方法,非常容易编程,操作系统自己负责完成,等等。请记住,一旦你有多个套接字要读取,你将不得不做一个非常愚蠢的事情,比如每个套接字有一个线程(太糟糕了!),或者使用第一种方法重写您的应用程序。
Read in chunks (decide the size) say - 4096 and have a counter to keep reading each overlapped completion until the data was read (say it would complete 12 times till all the packet was read).
这是要走的路!事实上,这与方法 #1 几乎相同,只是进行了很好的优化,以尽可能少地执行与内核的往返,并一次读取尽可能多的内容。首先,我想用这些细节来纠正第一种方法,但后来我注意到您已经自己完成了。
希望对您有所帮助。祝你好运!
关于c++ - IOCP - 发布重叠或读取数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14911166/
使用 Python 的 rtmplib 绑定(bind)并遇到一些问题。 首先, 我有这样的东西: import librtmp conn = librtmp.RTMP(...) conn.con
基本上,我是在查看 Motorstorm 排行榜时在 PS3 上窃听数据包。排行榜以 XML 格式发送到我的 ps3,但只有在我获得授权后。那么有人可以告诉我这三个数据包之间发生了什么,以及我如何在浏
我正在努力了解 TCP,但解析大量 RFC 并没有帮助。我相信我了解连接和关闭握手,但我似乎无法找到任何总结实际数据流的内容。 在连接和关闭握手之间 TCP 数据包看起来像什么? (特别是标题) 最佳
我正在尝试通过 RCON 端口与我的 Minecraft 服务器通信。 虽然我不知道如何使用套接字和流的东西。四处寻找,我发现他们都有一些共同点。套接字、输入流和输出流。 我在我的代码中试过了,但返回
我正在 UDP 之上设计一个简单的协议(protocol),现在我意识到其他人可以将数据包发送到我正在监听的端口。这样的数据包对于我的应用程序来说显然是不正确的(我现在不担心安全问题) 是否有过滤这些
我目前有一个具有可自定义滴答率的游戏服务器,但在本示例中,我们建议服务器每秒仅滴答一次或 1hz。我想知道如果客户端发送速率比服务器快,因为我当前的设置似乎不起作用,那么处理传入数据包的最佳方法是什么
我无法理解网络字节顺序以及通过 UDP 发送和接收数据的顺序。我正在使用 C#。 我有一个结构保持: message.start_id = 0x7777CCCC; message.me
我正在为 USB 设备编写代码。假设 USB 主机开始控制读取传输以从设备读取一些数据,并且请求的数据量(设置数据包中的 wLength)是端点 0 最大数据包大小的倍数。那么在主机接收到所有数据后(
我有一台 Windows PC、Marvell 交换机、Netgear 交换机和一台 Ubuntu 机器连接在一起(通过 Netgear 交换机)。 我最近从 Windows PC 向 Marvell
在查看数据包字节码时,您将如何识别 dns 数据包。 IP header 的协议(protocol)字段会告诉后面有一个 UDP 帧,但是在 UDP 帧内没有协议(protocol)字段来指定接下来会
我有一个通过 udf 的 802.11 (wifi) 上各种类型的流量的 pcap。由于 MTU,udp(或更准确地说是 IP)对 wifi 数据包进行分段。我目前正在使用 SharpPcap 读取并
我正在开发的 Core Audio 应用程序上有此崩溃日志。我目前正在调试它,所以我的问题不是关于崩溃本身,而是关于 的含义“k”包 . 这是什么意思 ? 我已阅读 this , 和 this (关于
我在一台 VM Ubuntu 16.04 机器上的 100 个多播组上生成 UDP 数据包,并在另一台 VM Ubuntu 16.04 机器上订阅这些组。两者都在由 Hyper-V 管理器运行的 HP
这个问题在这里已经有了答案: How can I fix 'android.os.NetworkOnMainThreadException'? (66 个回答) 6年前关闭。 我正在尝试创建一个简单的
我正在寻找使用 Java 来欺骗 UDP 数据包。是否有任何好的 Java 库可以让您创建自己的 RAW SOCKETS? 最佳答案 我会使用包装 libpcap 的 Java API . libpc
我在基于 Tyrus 的客户端和 tomcat Web 服务器之间使用没有压缩的 websocket。我在 tomcat 端看到消息传入和传出我的套接字,但如果我设置一个wireshark来观察它们传
我的应用程序在模拟器中运行时无法接收 UDP 数据包。 UDP 数据包由“localhost”上的以下 java 程序通过端口 49999 发送。 DatagramSocket clien
我正在开发一个 Google Glass 应用程序,它需要在工作线程中监听 UDP 数据包(与发送 UDP 数据包的现有系统集成)。我之前发布了一个问题(请参阅 here )并收到了一个答案,其中提供
我正在从客户端向服务器发送两个数据包。我遇到的问题是,在服务器上读取的数据使两个字符串对于发送的最长字符串具有相同的长度。例如: 如果字符串 1 为:1234 字符串 2 为:abcdefghi 服务
我知道这是不好的做法,但是可以执行以下操作吗? Send packet1 to UDP port 1 port 1 receives packet1 and sends it to port 2 po
我是一名优秀的程序员,十分优秀!