我想设置为记录在这里的Ehcache复制:http://ehcache.sourceforge.net/EhcacheUserGuide.html#id.s22.2
这是在Windows机器上,但在生产中在Solaris将最终运行.
说明如下设置提供者:
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
multicastGroupPort=4446, timeToLive=32"/>
Run Code Online (Sandbox Code Playgroud)
像这样的倾听者:
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="hostName=localhost, port=40001,
socketTimeoutMillis=2000"/>
Run Code Online (Sandbox Code Playgroud)
我的问题是:
多播IP地址和端口是否是任意的(我知道地址必须在特定范围内,但它们必须是特定的数字)?
它们是否需要由我们的系统管理员以某种方式设置(我在办公室网络上)?
我想在本地测试它,所以使用上面的配置运行两个单独的tomcat实例.我需要在每个方面做些什么改变?我知道两个听众都听不到同一个端口 - 但提供商怎么样?
另外,侦听器端口是否也是任意的?
我已经尝试过如上设置,但在我的测试中,缓存似乎没有被复制 - 在一个tomcat的缓存中添加的值不存在于另一个缓存中.
我可以做些什么来调试这种情况(除了数据包嗅探)?
在此先感谢任何帮助,一直在我的头发上撕裂!
我正在考虑使用一组对象,假设此时有3个对象存活,它们都实现了一个公共接口,然后将这些对象包装在第四个对象中,同时实现相同的接口.
第四个对象的方法和属性的实现将简单地调用这3个底层对象上的相关位.我知道这里会出现这样的情况,这样做是没有意义的,但这是针对服务多播架构的,因此已经有了一套很好的限制.
我的问题是从哪里开始.第四个对象的生成应该在运行时在内存中完成,所以我在想Reflection.Emit,不幸的是我没有足够的经验来知道从哪里开始.
我是否必须构建内存中的程序集?它看起来确实如此,但我只想快速指向我应该从哪里开始.
基本上我正在寻找一个接口,以及一个实现该接口的对象实例列表,并构建一个新对象,同时实现该接口,该接口应该"多播"所有方法调用和对所有底层对象的属性访问,at尽可能少.异常会有很多问题,但是当我到达它们时我会解决这些问题.
这适用于面向服务的体系结构,我希望现有的代码(例如,记录器服务)现在可以访问多个记录器服务,而无需更改使用服务的代码.相反,我想运行时生成一个logger-service-wrapper,它在内部简单地调用多个底层对象上的相关方法.
这适用于.NET 3.5和C#.
我试着编写一个服务器/服务,在局域网上传播消息的时间大约是一秒钟,有点像服务发现.
该消息需要由可能位于同一台计算机或不同计算机上的多个客户端程序接收.但是每台机器上可能同时运行多个程序.
我使用delphi7,indy 9.0.18
如果我应该使用UDP(TIdUDPClient/Server)或IP MultiCast(TIdIPMCastClient/Server)或者如果它甚至可能...
我设法让它与IP Multi Cast一起使用每台机器一个客户端,但即使经过多次使用不同的绑定..最大/最小端口等,我似乎无法找到解决方案.
有没有办法配置Amazon EC2实例以支持EhCache自动发现所需的多播?(通过iptables hacks等)/
我有一个java应用程序,它使用一些MulticastSocket实例来监听一些UDP多播源.每个这样的套接字由专用线程处理.
线程读取每个Datagram,解析它的内容并写入log(log4j)数据包的序列id(long)和接收数据报的时间戳.
当我尝试在Windows Server 2008 R2上运行相同应用程序的2个实例(具有2*6个内核)并比较2个应用程序创建的2个日志时,我注意到数据包的时间频繁不同.
大多数数据包同时由2个应用程序(milis)接收,但两个应用程序在同一数据包的接收时间之间经常存在大约1-7ms的差异.
我尝试在NIC中分配更多缓冲区,并使套接字读取缓冲区更大.此外,我尝试最小化GC运行,我也使用-verbose:gc,可以看到GC时间和有问题的时间差异不会同时发生.这允许我假设我的问题与GC无关.
没有观察到丢包问题,并且不太可能出现带宽问题.
欢迎提出意见/建议.谢谢.
我正在设计一个系统,它有多个小型嵌入式系统主机在局域网中进行通信.UDP多播非常适合我的目的.
但我担心普通路由器的组播支持.我需要将系统部署到配备Wifi路由器的普通家庭,因此我可以遇到任何类型的路由器.如果多播将比使用更麻烦,我将使用UDP广播.
为了做出决定,我感谢今天普通路由器中有关多播支持的任何数据或经验:
我希望将UDP组播数据包发送到环回地址,并在其他应用程序中接收相同的数据包.所有测试都在fedora core 17 Linux上完成.
我们的想法是通过RTSP/HTTP或任何其他网络协议接收视频流,并将其多播到环回地址,以便我可以使用VLC使用多播地址播放流.暂且不谈其他比特率和受控多播问题,我尝试在环回设备上读取一个视频文件和多播.但是当试图在vlc上播放同样的内容时它没有用.我能够看到数据包在wireshark中传输,但src ip取自我的默认网络接口(即接口,这是我的默认网关)
我已经尝试过以下命令
sudo ifconfig lo multicast
sudo ip route add 239.252.10.10 dev lo
Run Code Online (Sandbox Code Playgroud)
在这方面的任何建议都会非常有帮助.
测试程序代码粘贴在下面
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MULTICAST_ADDRESS "239.252.10.10"
#define UDP_PORT 1234
#define INTERFACE_IP "127.0.0.1"
#define MTU 1474
#define DATA_BUFFER_SIZE (1024*1024)
static int socket_init(char *intf_ip) {
int sd;
struct in_addr localInterface;
sd = socket (AF_INET, SOCK_DGRAM, 0);
if (sd < 0) {
perror ("Opening datagram socket error");
return -1;
} …Run Code Online (Sandbox Code Playgroud) 我在网络编程方面经验不足,我正在编写一个多平台系统,要求每个设备能够在同一个局域网内找到其他设备.我正在寻找正确的方法来做到这一点,并希望这里的人们可以给出一个很好的建议.这是我的设计要求:
我使用的是C++,解决方案需要跨平台,至少能够在iOS,Windows,Android上运行.
如果可能的话,系统应该非常轻,并且在没有特殊设置或网络要求的情况下工作.
以下是我正在考虑的不同方法:
使用uPnP协议,但我对它不是很熟悉,似乎没有很多关于这个主题的代码示例.
使用传统的套接字方法,在每个设备上创建服务器/客户端,并将数据包发送到LAN中的每个IP.然后手动完成所有事情.如果我错了,纠正我,如果我发送数据包到广播地址,这是否意味着系统自动将我的数据包发送到子网内的每个IP?
使用外部服务器,所有客户端都将注册,然后从该服务器获取有关其他(已注册)客户端的信息.但是,我不确定每个客户端应该连接哪些信息以确定它们位于同一LAN中.
让我知道我在想什么是有意义的.任何意见是极大的赞赏.
Apple现在要求iOS 9应用程序符合IPv6标准.除了一些发送UDP广播的代码之外,我们大多都没问题 - 现在这在iOS 9中失败了.
我读到的所有内容都告诉我,UDP组播是在IPv6中实现这一目标的正确方法.我找到了一些示例代码,但它不适用于我试过的任何版本的iOS或Mac OS X.
这个代码是从我们程序中的C/C++ lib调用的 - 很难回调到Swift,Obj-C,Java等.这个代码将由我们的应用程序的Mac OS X和Android版本共享.有人会认为在任何POSIX环境中都可以在C中进行IPv6组播!
在下面的示例中,执行成功直到最后的sendto()调用,该调用实际上发送UDP消息.sendto()失败,失败后errno设置为EBROKENPIPE(22).
我最好的猜测是我错过了一些必需的setsockopt()调用,或者使用了错误的多播地址.现在,我很难过.
这是我正在进行的函数调用(在UDP端口4031上组播"是否有任何人?"):
char *msg = "Is anybody out there?";
err = multicast_udp_msg ( "FF01::1111", 4031, msg, strlen(msg) );
Run Code Online (Sandbox Code Playgroud)
这是被调用的代码:
// Multicasts a message on a specific UDP port.
// myhost - IPv6 address on which to multicast the message (i.e., ourself)
// port - UDP port on which to broadcast the mssage
// msg - message contents to broadcast
// msgsize - length of message …Run Code Online (Sandbox Code Playgroud) 似乎多播接收在某些Android设备上不起作用.我无法通过13个测试设备中的4个接收多播.在这4个设备上,应用程序似乎不发送加入多播组的IGMP请求.
接收多播的代码如下所示:
WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
WifiManager.WifiLock wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, TAG);
WifiManager.MulticastLock multicastLock = wifiManager.createMulticastLock(TAG);
multicastLock.setReferenceCounted(true);
wifiLock.acquire();
multicastLock.acquire();
try {
MulticastSocket socket = new MulticastSocket(32123);
InetAddress group = InetAddress.getByName("224.1.2.3");
socket.joinGroup(group);
DatagramPacket packet;
byte[] buf = new byte[256];
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
socket.leaveGroup(group);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
multicastLock.release();
wifiLock.release();
Run Code Online (Sandbox Code Playgroud)
该应用具有以下权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
Run Code Online (Sandbox Code Playgroud)
为了演示这个问题,我在GitHub:MulticastTest上使用上面的代码创建了一个小测试项目.
我的代码有问题吗?我错过了许可吗?
编辑1:此问题似乎与特定的Android版本无关.我可以在Android 4.x,5.x和6.x上重现这种行为.
编辑2:有一个相关的问题.