草庐IT

c++ - UDP sendto() 和 recvfrom() 最大缓冲区大小

我知道我可以使用这些函数的默认最大缓冲区大小是65507(5535-IPv4header-UDPheader)。但是,有没有办法改变这种情况?我需要能够发送更大的缓冲区~66000字节。我尝试使用setsockopt()函数,但它似乎不起作用。谢谢! 最佳答案 没有。UDP仅提供数据报作为IP数据包的数据部分,IP数据包具有16位长度字段,因此将数据限制为2^16字节(包括header),或UDP数据部分为65507字节(假设没有ipv4选项),除了将它们分成几个数据包并自己处理重组等之外,没有办法用UDP处理更大的数据包。

windows - 检测UDP组播接收失败

我有一个UDP服务器,它绑定(bind)到一个众所周知的端口,将自己添加到一个多播组并监听客户端的请求。(服务器在Windows上,并使用WSARecvFrom为客户端数据报发出重叠接收。)客户端通过已知端口和多播IP地址向服务器发送消息。在笔记本电脑上测试“服务器”时,我注意到如果笔记本电脑进入“sleep”状态,服务器的接收套接字将与多播地址“解除绑定(bind)”(这样客户端发送到多播地址就不会-收到时间更长)。但是,套接字仍在接收,因为仍然接收到发送到其127.0.0.1端口的消息-并且Windows没有指示任何错误。(服务器套接字绑定(bind)到INADDR_ANY。)“服

c++ - 接收大量 (r) UDP 流量时 CPU 负载高 (Windows)

我正在调查使用大量传入数据进行进一步处理(具体来说是多播传输流)的应用程序的问题。情况如下:添加了多个组播流。每个都有自己的接收线程,从套接字接收数据,然后将其复制到环形缓冲区中。它不再做任何事。在大约500到600mbit时,一个特定的CPU内核达到100%。事实上,在初始化流时,随着以太网流量的增加,我可以看到它几乎呈线性上升到该负载。套接字代码使用WSA重叠API。即使我减少线程只做那件事(即不复制到环形缓冲区,这反过来又将主机应用程序的任何负载减少到接近零),我也很容易将那个特定的核心变成红色。同样有趣的是,即使我通过关联设置将其限制为4个完全不同的内核,该负载仍存在于该特定内

windows - Windows 上 IPC 的命名管道与 UDP

为什么命名管道更适合本地Windows机器上的IPC(进程间通信)而不是UDP?或者UDP有时可能在某个地方更好? 最佳答案 即使在本地主机上的UDP数据包也可能丢失。此外,由于UDP是基于数据报的并且无法保证交付,因此很难传输较大的数据block。最后,本地主机上的UDP有时会被浏览器阻止。一般来说,单机IPC通常不考虑UDP。在Windows上,我推荐内存映射文件+同步原语作为最快且可能是最简单的方法。当您管理命名管道工作时,命名管道通常运行良好,但我在这里看到很多关于如何使命名管道工作的问题(而且我还没有看到任何关于MMF的投

c# - 如果 UDP 数据包在线上,我能保证在应用层得到它们吗?

首先我明白UDP不是一个可靠的协议(protocol),我不能保证通过网络接收数据包。但是,如果数据包确实到达了我的机器,我能保证在应用程序级别接收到它,还是网络堆栈可以将其丢弃而不受惩罚?我问的原因是我似乎偶尔会丢失数据包,即使我知道它们在线路上(简单的EtherCAT总线,所以数据包总是环回)。 最佳答案 不,即使数据包到达您的机器,也不能保证它们一定会到达您的应用程序。内核的UDP接收队列是有限的,如果数据包到达的速度快于您的应用程序可以处理的速度,队列将填满并且一些数据包将被丢弃。您可以增加接收缓冲区的大小(请参阅thisq

c++ - XP和Vista之间使用winsock API的UDP组播区别

WindowsXP和windowsvista之间设置UDP多播套接字所需的实现似乎有所不同。具体来说:在WindowsXP下,您必须调用bind(),然后才能引用任何特定于多播的套接字选项。但是,在windowsvista下,您不得在处理多播套接字时调用bind()。这两点中的任何一个失败都会导致运行时出现套接字错误。我是不是疯了,还是其他人也看到了?有没有比bind()调用的条件编译更好的解决方案? 最佳答案 在应用IP_ADD_MEMBERSHIP并加入多播组时调用setsockopt()会出现什么错误?我刚刚在这里用我的服务器

windows - UDP 监听套接字在网络配置更改后停止监听

我有一个UDP套接字在端口中监听广播传输,它工作正常。但是,当我休眠并恢复操作系统(Windows7)时,套接字只是停止接收数据(并且我可以看到有数据使用Wireshark到达)。如果我更改任何网络设置,如更改我的IP地址、禁用和启用网络适配器,也会发生这种情况。操作系统似乎在休眠时禁用所有网络适配器,并在恢复时重新启用它们。select只返回0(超时),这与我没有收到任何数据时没有什么不同。我在任何地方都找不到对这种行为的任何引用。如果我关闭套接字并重新创建它,它会再次开始工作。我的TCP监听套接字在恢复操作系统后仍然工作正常。关于如何检测和纠正这种情况有什么想法吗?编辑:它仍然可以

Python UDP 套接字半随机接收失败

我遇到了一些问题,我猜是代码问题。该应用程序用于“ping”一些定制的网络设备以检查它们是否存在。它每20秒使用一个特殊的UDP数据包对它们执行ping操作,并期待响应。如果他们未能连续3次回答ping,应用程序会向工作人员发送一条警告消息。应用程序全天候24/7运行,并且一天有随机次数(大部分是2-5次)应用程序在10分钟的准确时间内无法接收UDP数据包,之后一切恢复正常。在那10分钟内,似乎只有1台设备在回复,其他设备似乎已经死了。我已经能够从日志中推断出这一点。我已经使用wireshark嗅探数据包,并且我已经验证了ping数据包同时进出,所以网络部分似乎工作正常,一直到操作系统

Windows BAT 或 CMD : send some data to a localhost udp port

我有一个监听本地主机端口的应用程序。我想要一个最小的启动器来将该应用程序带到最前面。我的应用程序是用Java编写的。我不知道如何编写任何exe文件,但我可以编写bat文件,然后制作一个快捷方式,在不显示终端的情况下启动bat文件。我想让bat文件将一些数据发送到端口(最好是UDP,这样就不会有任何流开销)。如何将数据发送到UDP端口?我想到的其中一件事是nslookup,但据我所知,它只会连接到端口53。这只需要在Windows上工作。希望它能在XP及更高版本上运行,但如有必要,我可以制定解决方法。 最佳答案 这是netcat的工作

c++ - 在 C++ 中查看 UDP 消息

我正在尝试使用C++中的套接字接收UDP消息。我在header中发送消息的大小,所以我可以知道我应该分配多少内存,所以我尝试像这样查看消息的开头:intbytesRead=recvfrom(m_socketId,(char*)&header,Message::HeaderSize,MSG_PEEK,(structsockaddr*)&fromAddr,&addrSize);但我不断收到系统错误10040:"Amessagesentonadatagramsocketwaslargerthantheinternalmessagebufferorsomeothernetworklimit,o