1
2
如果您正在从原始套接字(如源代码中所示)读取数据包,那么您可以轻松地从同一个套接字读取所有数据包。确保这是你打算做的。原始套接字用于进行数据包检查,用于故障排除、法医、安全或教育目的。你不能这样轻易地与另一个系统通信。 同样地,这里的接收调用在协议上也不会有所不同,因为实际上 使用 TCP或UDP,您只需接收那些协议构建和解码的原始数据包。
任何一个都可以。
当使用这样的原始套接字时,一次只能得到一个数据包。你永远不会得到超过一个。如果您提供的缓冲区不够大,那么数据包将被截断(丢弃结束字节)。
一般来说,大多数网络上的数据包限制在1514字节左右。这是因为在网络接口上配置的传统“MTU”(最大传输单元)是1500字节,并且通常会预先准备一个包含两个MAC地址(每个MAC地址6字节)和一个两字节EtherType的以太网头段。在交换机或路由器中,您还可以看到包含VLAN头的额外4字节头的数据包(IEEE802.1q)。(但是,一些网络内部使用的“巨型”数据包大小高达9K左右,用于特定目的。) 您还应该理解,在编写应用程序时,可以发送大于最大数据包大小的UDP数据报(或TCP缓冲区)。在这种情况下,操作系统将这些数据分成更小的块进行发送(在提交到应用程序之前,它们在目标端重新组装)。当您接收到这样的原始数据包时,您将看到这些数据包处于低级(可能是碎片状)状态。
操作系统将为您保留一个包队列。当然,它的大小是有限的,因为您无法以全线路速率(更不用说10GB或更高的网卡)跟上1GB的网卡。大小是以特定于系统的方式配置的。在Linux上——可能还有其他基于Unix的系统上——您可以调用
在Linux上,至少可以使用
|
2
1
我认为您不应该这样做,因为TCP保证了诸如可靠性、排序、流控制和拥塞等各种各样的事情。但是,UDP不保证任何内容。 这些参数是在操作系统创建套接字时定义的。这就是为什么我认为你不能做到你所说的。 打开两个不同的套接字,一个本机UDP套接字和一个本机TCP套接字。 |
slim71 · C-通过套接字向客户端发送UDP消息 6 年前 |
alsaleem · 执行UDP套接字。接收开始收集还是可用? 6 年前 |
ilya · 使用iperf3测量STM32板上的UDP吞吐量 6 年前 |
Ephemera · 服务器能否直接连接其连接的两个套接字? 6 年前 |
Jamboree · 跨NAT的UDP客户端无法从服务器接收数据 6 年前 |
Niranjan Godbole · 无法在c中使用udp发送数据# 7 年前 |
en Lopes · Java UDP服务器不工作 7 年前 |
Iago SP · 如何在golang中发送假udp包 7 年前 |