问题标签 [datagram]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4429 浏览

java - 如何设置 udp 数据包的格式?

在一项任务中,需要通过将 2 台笔记本电脑中的无线 LAN 卡切换到 ad hoc 模式,然后选择合适的 SSID,在 2 台笔记本电脑之间形成一个 ad hoc 网络。我在labtops 之间创建了一个adhock 网络。然后需要开发一个“Sender”和一个“Receiver”应用程序,从一台笔记本电脑发送一个简单的“Hello World”消息,并使用套接字在另一台笔记本电脑上接收它。我使用 udp 数据报套接字和 udp 数据包成功地做到了(在 java 中),因为 adhoc 网络中没有服务器。唯一的问题是,数据包格式应如下所示,其中数据表示为最大长度 = 64 KB 的字节数组(假设提供 IP 地址2个字节):

我知道在接收方,您可以使用 packet.getAddress(); 获取发送数据包的地址。并且接收方的地址是已知的,但我不明白这种格式的目的或如何设置数据包的格式。我只想知道 udp 数据包的实际格式是什么以及如何在 java 中设置 udp 数据包的格式。如何通过指定缓冲区字节数组、intelAddress 和端口来创建 dataGram 数据包来设置数据包的格式?我是否需要将缓冲区字节数组修改为与上述相同的格式(尽管发送方的地址无论如何都会发送)?请尽快回复我。任何帮助将不胜感激。提前致谢。

0 投票
2 回答
692 浏览

trim - 在收到的 DatagramPacket 中修整 0x00

在我的 Java 应用程序中,我通过 DatagramSocket 接收 DatagramPacket。我知道数据包可以包含的最大字节数,但实际上每个数据包的长度都不同(不超过最大长度)。

假设 MAX_PACKET_LENGTH = 1024(字节)。因此,每次接收到 DatagramPacket 时,它都是 1024 字节长,但并非所有字节都包含信息。可能会发生数据包有 10 个字节的有用数据,其余 1014 个字节用 0x00 填充。

我想知道是否有任何优雅的方法来修剪这个 0x00 (未使用的)字节以便仅将有用的数据传递给另一层?(也许是一些 Java 本地方法?进入循环并分析数据包包含的内容不是我们想要的解决方案 :))

感谢所有提示。彼得

0 投票
2 回答
1427 浏览

java - 使用套接字将文件从 C++ 应用程序传输到 Java 应用程序

我正在尝试使用套接字将文件从 C++ 应用程序传输到 Java 应用程序。我用 C++ 编写了这个简单的代码来发送文件:

在 Java 方面,这就是我写下收到的数据的方式:

结果是我收到的文件在一定程度上是正确的,但并不完整。我的 Java 代码或 C++ 部分的代码有什么问题吗?谢谢!

0 投票
4 回答
4069 浏览

java - “丢失”的 UDP 数据包(JBoss + DatagramSocket)

我开发了一些基于 JBoss+EJB 的企业应用程序的一部分。我的模块需要处理大量传入的 UDP 数据包。我已经做了一些负载测试,看起来如果以 11ms 的间隔发送数据包,一切都很好,但是在 10ms 的间隔的情况下,一些数据包会丢失。在我看来这很奇怪,但我多次进行了 10/11ms 间隔负载测试比较,结果总是相同(10ms - 一些“丢失”的数据包,11ms - 一切都很好)。

如果同步有问题,我希望它在 11 毫秒测试(至少一个数据包丢失,或至少一个错误的计数器值)的情况下也是可见的。因此,如果不是因为同步,那么我接收数据包的 DatagramSocket 可能无法按预期工作。

我发现接收缓冲区大小(SO_RCVBUF)具有默认值 57344(可能它依赖于底层 IO 网络缓冲区)。我怀疑,也许当这个缓冲区已满时,新传入的 UDP 数据报会被拒绝。我尝试将此值设置为更高,但我注意到如果我夸大其词,缓冲区将返回到其默认大小。如果它依赖于底层,我如何从 JBoss 级别找出某些操作系统/网卡的最大缓冲区大小?

是否可能是由接收缓冲区大小引起的,或者 57344 值可能足以处理大多数情况?您对此类问题有任何经验吗?

我的 DatagramSocket 上没有设置超时。我的 UDP 数据报包含大约 70 个字节的数据(不包括数据报头的值)。

[已编辑] 我必须使用 UDP,因为我收到 Cisco Netflow 数据 - 它是网络设备用来发送一些流量统计数据的协议。此外,我对发送的字节格式没有影响(例如,我不能为数据包添加计数器等)。预计不会处理所有数据包(一些数据报可能会丢失),但我希望我会处理大部分数据包。在 10 毫秒间隔测试期间,大约 30% 的数据包丢失。

缓慢的处理不太可能导致此问题。目前单例组件在循环中保存对 DatagramSocket 调用接收方法的引用。收到数据包后,将其传递到队列中,并由从池中选择的无状态组件进行处理。“门面”Singleton 只负责接收数据包并将其传递给处理(它不会等待处理完成事件)。

提前致谢, 皮奥特

0 投票
3 回答
15734 浏览

java - 如何在java中通过UDP发送一个int

我正在尝试编写一些通过 UDP 发送单个 int 的代码。我到目前为止的代码:

发件人:

接收者:

问题是接收器在屏幕上打印“50”,这显然是不正确的。我认为问题可能是我以某种方式将它作为字符串或其他东西发送,并且它没有正确读取它。有什么帮助吗?

0 投票
1 回答
1285 浏览

java - 如何在有限的时间内(超时)仅从 DatagramSocket 块中读取?

我正在模拟网络数据包传输丢失。我的服务器应用程序有时不会将数据发送回我的客户端。

在我的客户端中,我每秒钟对服务器执行 10 次 ping 操作。但是,在我的服务器没有发回任何东西的情况下,我的客户端将等待直到收到下一个数据包。如果我没有从服务器得到任何东西,我该如何继续下一次迭代?

0 投票
3 回答
2773 浏览

c - 写入数据报套接字是否会引发 SIGPIPE?

我正在使用一些代码,这些代码需要安全地防止杀死调用者SIGPIPE,但它正在执行的唯一套接字写入是数据报套接字(UDP 和 Unix 域数据报套接字)。我需要担心SIGPIPE吗?我connect在套接字上使用,但初步测试(在 Linux 上)表明,ECONNREFUSED如果没有人在 Unix 域套接字上监听,我只会发送。不确定UDP会发生什么。

我可以将整个事情包装在 hacks 中以摆脱SIGPIPE,但如果这不是问题,我宁愿节省开销并降低代码复杂性。

0 投票
4 回答
443 浏览

java - DatagramPacket Sender Thread 运行太快

我编写了一个 Java 线程(Runnable)来基本上存储一个 DatagramPackets 列表,如果列表的大小 > 0,它将发送列表中的第一项。

似乎除非我在 run 方法中放置大量睡眠,否则线程将变得无响应

_packetQ 是数据报包的链表。

无论如何我可以停止线程锁定或让它仅在 packetQ.size() > 0 时运行

谢谢

更新:哦,亲爱的,由于代码中的错误,数据包甚至没有被推送到队列中,只是浪费了一个小时的调试时间。感谢您的回复**

0 投票
3 回答
854 浏览

linux - linux内核->用户空间多播流数据报

我打算为一些内存映射硬件编写一个linux驱动程序(它在一个FPGA中,所以如果需要我可以在两端调整这个内存映射接口)。

该 FPGA 逻辑生成一系列数据报,我必须对其进行处理,然后通过以太网链路进行传输。处理或网络代码都没有理由在内核中,所以我询问将数据块从硬件移动到用户空间的“最佳”机制。最大的复杂性是用户空间处理应该分布在多个进程之间。

数据速率不是很高(高达 1Mbps),mmio 接口由一个相当深的 FIFO(目前 2KB,可以增加到 8KB)提供,所以我认为高优先级的用户模式进程可以跟上。

我真正想要的是一个指向具有现有多播用户空间接口的现有驱动程序的指针(并且并不复杂)。但是,必须做的事情的大纲将是一个合理的替代品。

到目前为止,我收集了以下想法:

  • AF_NETLINK:支持多播,为我负责缓冲。但是API不稳定,我必须定义一个新的socket id,这可能与其他in-tree驱动程序冲突,而且用户模式接口非常专业,我不能使用标准工具socat来测试数据流。

  • 从用户空间传递一个数据报模式套接字或 FIFO 文件描述符,并写入它(如何?)。有一个我可以应用的 unix 域数据报套接字多播补丁。

  • 将字符模式设备暴露给单个高优先级用户模式应用程序,该应用程序充当 unix 域数据报套接字服务器并将数据报复制到每个连接的节点。是否为字符模式设备保留了数据报边界(即,如果我的驱动程序read函数返回的字节数少于fread缓冲区大小,将把fread该数据块作为一个单元返回,或者它可以分段和重新组装块吗?如果我使用read (2)而不是它有帮助fread (3)吗?是否有类似EMSGSIZE的驱动程序的读取函数可以用来指示数据报被截断,或者仅适用于套接字?)

  • 暴露一个可以被多个用户模式应用程序同时打开的字符模式设备,并将数据缓冲到每个内核中。

我倾向于使用具有重新路由传入数据包的 unix 域服务器的字符模式设备。这使我不必在内核驱动程序中实现缓冲逻辑。那么问题就变成了如何在select中断发生时从调用或阻塞读取中唤醒用户进程。如果数据已经可用,我的函数似乎poll可以读取控制寄存器并返回,如果没有,则取消屏蔽中断。POLLIN|POLLRDNORM然后中断处理程序将使用wake_up标记wait_queue为准备就绪。 read总是会屏蔽中断。

0 投票
1 回答
5032 浏览

java - 从 tcp 到 udp 的 Java 套接字

如何在 java 中将此代码 (tcp) 获取到 udp?谢谢。