当前位置: 首页 > 面试题库 >

如何获得UDP套接字的排队数据量?

许黎明
2023-03-14
问题内容

为了查看我在处理传入数据方面的表现如何,我想测量TCP和UDP套接字上的队列长度。

我知道我可以通过SO_RCVBUF套接字选项获取队列大小,并且可以ioctl(<sockfd>, SIOCINQ, &<some_int>)告诉我有关TCP套接字的信息。但是对于UDP,SIOCINQ/
FIONREADioctl仅返回下一个未决数据报的大小。有没有一种方法可以获取UDP的队列大小,而无需解析系统表,例如/proc/net/udp


问题答案:

如ldx所述,ioctl或getsockopt不支持它。在我看来,SIOCINQ的当前实现旨在确定读取整个等待缓冲区需要多少缓冲区(但我想它并没有那么有用,因为它可以在读取到实际缓冲区之间进行切换读)。

尽管有许多其他遥测技术,但通过此类系统调用均不受支持,我想正常生产中并没有真正的需求。

您可以通过“ netstat -su”检查丢失/错误,或者,如果您只想监视计算机状态,则可以使用SNMP(udpInErrors)更好。

顺便说一句:您始终可以选择入侵内核代码并添加此值(或其他值)。



 类似资料:
  • 我想使用Qt UDP(不是TCP)套接字传输文件。所以我这样写代码: 看来要传输的Qt UDP数据包的最小大小是8192字节。接收方总是得到第一个数据包,但不能接收其他数据包。 我对Qt和网络编程的经验很少,所以我不知道我的猜想对不对。你能告诉我如何改变这些代码来支持在第一个数据包之后接收数据包,这样我就可以传输大数据了吗?

  • 我有一个.NET套接字(),我想将它用于UDP(无连接通信)。我想用轮询接收数据报,也就是说,我想调用方法来检查一个数据报是否可用。如果是,我调用来接收它而不阻塞。如果不是,我会等待,稍后再投票。但现在我的问题是: 如何确定一个数据报何时结束而下一个数据报何时开始?

  • 我必须通过udp套接字发送多个变量类型:int数组和char。我想用相同的udp数据包发送它。标准溶液是什么?将所有内容转换为字节或类似的内容? 我使用的是:sendto(int-sockfd,const-void*buf,size\t len,int-flags,const-struct-sockaddr*dest\u-addr,socklen\t-addrlen); 我的代码是这样的:

  • 在基本节点http服务器上,如下所示: 如果我一次向服务器发送500个请求,数量是一致的。连接在350附近。由于硬限制设置为500(也),我想知道在新请求启动时如何访问挂起的连接数(本例中最多150)。 查看node-http,有一个名为的事件,因此我认为请求的往返行程如下: 客户端连接到服务器套接字-->3路握手,套接字持续状态(或?!)然后在节点事件中发出连接。 节点http服务器接受这个挂起

  • 问题内容: 我听说可以通过创建一个并将我的()连接到有效的目标IP地址(例如Google)来获得自己的IP地址(不是127.0.0.1)。 但是,我找不到任何参考或示例。 这可能吗?如果是这样,我该怎么做? 问题答案: 呼叫,然后在您的套接字上。它将返回套接字现在绑定到的IP地址,该地址已被IP路由表选择为到达目标地址的最佳路由。 但是,除非您只有一个外部IP地址,否则不一定是您要查找的IP地址。

  • 当服务器只有1个UDP套接字,并且许多客户端向其发送UDP数据包时,处理所有传入数据包的最佳方法是什么? 我认为这也可能是TCP数据包的一个问题,因为线程数量有限,无法涵盖所有客户端TCP套接字接收事件。 但在这种情况下情况会更好,因为每个客户端有1个TCP套接字,即使网络缓冲区已满,数据包接收也会被阻止,直到队列有空间为止(如果我错了,请告诉我)。 然而,当缓冲区已满且只有1个套接字时,UDP数