我有一个应用程序从同一端口上的多个组播源接收数据.我能够收到数据.但是,我试图考虑每个组的统计信息(即收到的消息,收到的字节数),所有数据都混淆了.有谁知道如何解决这个问题?如果我试着查看发件人的地址,那么它不是多播地址,而是发送机器的IP.
我使用以下套接字选项:
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("224.1.2.3");
mreq.imr_interface.s_addr = INADDR_ANY;
setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
Run Code Online (Sandbox Code Playgroud)
并且:
setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &reuse, sizeof(reuse));
Run Code Online (Sandbox Code Playgroud) 我熟悉多播等等.
使用了两个主要示例:
使用Socket与Bind()
UDPClient.JoinMulticastNetwork()
一个指定一个LeaveMulticastGroup和另一个绑定和Joining没有LeaveMulticastGroup()
两种多播方法有什么区别,哪种方法更适合使用?
我正在尝试使用套接字和c ++(c)获取udp组播数据.我有一个带有2个网卡的服务器,所以我需要将套接字绑定到特定的接口.目前我正在另一台只有一张网卡的服务器上进行测试.
当我使用INADDR_ANY时,我可以看到udp数据,当我绑定到特定接口时,我看不到任何数据.函数inet_addr没有失败(我现在删除了检查返回值).
代码如下.在具有一个网卡的服务器上,我的IP地址是10.81.128.44.我运行时收到数据:./ client 225.0.0.37 12346
这没有给我数据:./ client 225.0.0.37 12346 10.81.128.44
有什么建议?(希望代码编译,我删除了评论......)
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
#define HELLO_PORT 12345
#define HELLO_GROUP "225.0.0.37"
#define MSGBUFSIZE 256
int main(int argc, char *argv[])
{
string source_iface;
string group(HELLO_GROUP);
int port(HELLO_PORT);
if (!(argc < 2)) group = argv[1];
if (!(argc < 3)) port = atoi(argv[2]);
if (!(argc < 4)) source_iface = argv[3];
cout << …Run Code Online (Sandbox Code Playgroud) 如果我想测试一组多播IP程序(发送器/接收器)而不必设置网络,可以在同一个盒子上完成吗?如果是这样,需要设置或完成哪些不同的操作?
在具有活动无线卡和LAN端口的计算机上,交叉电缆连接到运行相同应用程序的另一台计算机,我们需要通过LAN线路将UDP多播发送到另一台计算机.使用C#套接字,Windows似乎每次尝试通过WLAN适配器路由消息.
有没有办法指定发送UDP多播的网络接口?
我有一个代码,其中发送多播数据报.一段重要的代码:
uint32_t port;
int sockfd, err_ip;
const uint32_t sizebuff = 65535 - (20 + 8);
unsigned char *buff = (unsigned char *) malloc(sizebuff);
struct sockaddr_in servaddr, cliaddr;
struct in_addr serv_in_addr;
struct ip_mreq req;
port = str2uint16(cmdsrv->ipport);
bzero(buff, (size_t)sizebuff);
bzero(&servaddr, sizeof(servaddr));
bzero(&serv_in_addr, sizeof(serv_in_addr));
err_ip = inet_aton(cmdsrv->ipaddr, &serv_in_addr);
if(( err_ip != 0 ) && ( port != 0 )) {
servaddr.sin_family = AF_INET;
servaddr.sin_addr = serv_in_addr;
servaddr.sin_port = htons(port);
memcpy(&req.imr_multiaddr,&serv_in_addr,sizeof(req.imr_multiaddr));
req.imr_interface.s_addr = INADDR_ANY;
sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if( sockfd == -1 …Run Code Online (Sandbox Code Playgroud) 我想设置为记录在这里的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的缓存中添加的值不存在于另一个缓存中.
我可以做些什么来调试这种情况(除了数据包嗅探)?
在此先感谢任何帮助,一直在我的头发上撕裂!
我有一个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组播数据包发送到环回地址,并在其他应用程序中接收相同的数据包.所有测试都在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中.
让我知道我在想什么是有意义的.任何意见是极大的赞赏.