组播问题,200分……急切

OpenHero 2008-07-16 01:16:15
组播接收的时候,不同的ip组 相同的port
例如:
224.1.1.3 12345
224.1.1.2 12345
接受的时候,会出现什么问题?
遇到这个问题,怎么解决?
...全文
474 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
otisyf 2008-07-23
  • 打赏
  • 举报
回复
请教:
组播可以通过IP_MULTICAST_LOOP禁止本地的回环,对于广播怎样禁止回环呢?
fierygnu 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 OpenHero 的回复:]
引用 39 楼 fierygnu 的回复:
是什么问题?如何解决的?

我的blog上已经写了,client端也需要加上multicast 路由,还得打开multicast支持,不然就是走的broadcast,代码没有错。。。。
[/Quote]

奇怪,昨天试了一下,client不加multicast路由是可以的。。。

fuqd273 2008-07-22
  • 打赏
  • 举报
回复
mark
jufeng2309 2008-07-22
  • 打赏
  • 举报
回复
学习。。。
OpenHero 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 44 楼 fierygnu 的回复:]
引用 40 楼 OpenHero 的回复:
引用 39 楼 fierygnu 的回复:
是什么问题?如何解决的?

我的blog上已经写了,client端也需要加上multicast 路由,还得打开multicast支持,不然就是走的broadcast,代码没有错。。。。


奇怪,昨天试了一下,client不加multicast路由是可以的。。。


[/Quote]
……不会吧~~奇怪了,那就。。。。
linuxguy 2008-07-21
  • 打赏
  • 举报
回复
收藏了!
OpenHero 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 fierygnu 的回复:]
是什么问题?如何解决的?
[/Quote]
我的blog上已经写了,client端也需要加上multicast 路由,还得打开multicast支持,不然就是走的broadcast,代码没有错。。。。
OpenHero 2008-07-19
  • 打赏
  • 举报
回复
问题解决了:
http://blog.csdn.net/OpenHero/archive/2008/07/19/2675605.aspx
fierygnu 2008-07-19
  • 打赏
  • 举报
回复
是什么问题?如何解决的?
OpenHero 2008-07-17
  • 打赏
  • 举报
回复
本机的路由需要加什么吗?
OpenHero 2008-07-17
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 fierygnu 的回复:]
改成了什么样?把代码整理一下贴上来吧,看着头晕。
[/Quote]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef _WIN32
#include <winsock2.h>
#include <io.h>
#include <Ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib")

#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#define closesocket close
#endif

#define BUF_SIZE 0x1000

char * host_name = "224.1.1.3";
int port = 12345;

int main(int argc, char* argv[])
{
int loop = 1;
/* 多播循环 */
int iter = 0;
int from_len;
char buffer[BUF_SIZE];
int socket_descriptor;
struct ip_mreq command;
struct sockaddr_in loc;
struct sockaddr_in rem;

int rec_len =0;
int ptr_point = 0;
size_t bytes_written = 0;
int loop_times = 0;

int rcv_port_0 = 0;
int rcv_port_1 = 0;
int first = 0;

#ifdef _WIN32
WSADATA wsaData;

if( WSAStartup(MAKEWORD(2,2), &wsaData) != 0 )
{
printf("Error in WSAStartup\n");
exit(1);
}
#endif

if (argv[1])
{
host_name = argv[1];
printf("%s \n", host_name);
}
if (argv[2])
{
port = atoi(argv[2]);
printf("%d \n", port);
}

memset(&loc, 0, sizeof(loc));
loc.sin_family = AF_INET;
loc.sin_addr.s_addr = inet_addr(host_name);
loc.sin_port = htons(port);

if((socket_descriptor = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror("socket");
exit(EXIT_FAILURE);
}

/*can use the same port in the pc*/
loop = 1;
if(setsockopt(socket_descriptor, SOL_SOCKET, SO_REUSEADDR, &loop, sizeof(loop)) < 0)
{
perror("setsockopt:SO_REUSEADDR.\n");
exit(EXIT_FAILURE);
}else
{
printf("setsockopt:SO_REUSEADDR.\n");
}
loop = 0x1000000;
if( setsockopt( socket_descriptor, SOL_SOCKET, SO_RCVBUF, (void *) &loop, sizeof( loop ) ) < 0 )
{
perror("setsockopt:SO_RCVBUF.\n");
exit(EXIT_FAILURE);
}

#if defined( WIN32 ) || defined( UNDER_CE )
/*
* Under Win32 and for multicasting, we bind to INADDR_ANY.
* This is of course a severe bug, since the socket would logically
* receive unicast traffic, and multicast traffic of groups subscribed
* to via other sockets. How this actually works in Winsock, I don't
* know.
*/
if( IN_MULTICAST( ntohl( loc.sin_addr.s_addr ) ) )
{
struct sockaddr_in stupid = loc;
stupid.sin_addr.s_addr = INADDR_ANY;

if( bind( socket_descriptor, (struct sockaddr *)&stupid, sizeof( stupid ) ) < 0 )
{
perror("bind socket.\n");
close( socket_descriptor );
return 0;
}
}
else
#endif
if(bind(socket_descriptor, (struct sockaddr *)&loc, sizeof(loc)) < 0)
{
perror("bind socket.\n");
exit(EXIT_FAILURE);
}



{
printf("%s,%d\n", host_name, port);
command.imr_multiaddr.s_addr = inet_addr(host_name);
command.imr_interface.s_addr = htonl(INADDR_ANY);
if(command.imr_multiaddr.s_addr == -1)
{
perror("224.1.1.3 not a legal multicast address.\n");
exit(EXIT_FAILURE);
}
if (setsockopt(socket_descriptor, IPPROTO_IP, IP_ADD_MEMBERSHIP, &command, sizeof(command)) < 0)
{
perror("setsockopt:IP_ADD_MEMBERSHIP. error\n");
}
}


printf("start reciving...\n");


from_len = sizeof(rem);
while(1)
{
memset(&rem, 0, from_len);
memset(buffer, 0, BUF_SIZE);
if( (rec_len = recvfrom(socket_descriptor, buffer, sizeof(char) * BUF_SIZE, 0, (struct sockaddr *)&rem, &from_len)) == -1) {
perror("recvfrom.\n");
}

printf( "From host:%s port:%d, len: %d\n", inet_ntoa(rem.sin_addr), ntohs(rem.sin_port), rec_len);
}
if(setsockopt(socket_descriptor, IPPROTO_IP, IP_DROP_MEMBERSHIP, &command, sizeof(command)) < 0) {
perror("setsockopt:IP_DROP_MEMBERSHIP.\n");
}
closesocket(socket_descriptor);
exit(EXIT_SUCCESS);
}
fierygnu 2008-07-17
  • 打赏
  • 举报
回复
改成了什么样?把代码整理一下贴上来吧,看着头晕。
playmud 2008-07-17
  • 打赏
  • 举报
回复
交换机上的还是bub上的?是不是这个问题呢?
OpenHero 2008-07-17
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 fierygnu 的回复:]
loc.sin_addr.s_addr = htonl(INADDR_ANY);
//此处应绑定多播地址,否则,虽然你加入了多播组,但所有到达该端口的报文都会被接收。
Windows的协议栈实现可能不同。

[/Quote]

修改了,还是不行……
fierygnu 2008-07-17
  • 打赏
  • 举报
回复
loc.sin_addr.s_addr = htonl(INADDR_ANY);
//此处应绑定多播地址,否则,虽然你加入了多播组,但所有到达该端口的报文都会被接收。
Windows的协议栈实现可能不同。
威廉-丁 2008-07-17
  • 打赏
  • 举报
回复
帮顶
OpenHero 2008-07-17
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 fierygnu 的回复:]
只是收,不需要路由。

问题很奇怪,有时间试试看。
[/Quote]
555555 现在有时间吗……,这个很奇怪的问题
fierygnu 2008-07-17
  • 打赏
  • 举报
回复
只是收,不需要路由。

问题很奇怪,有时间试试看。
OpenHero 2008-07-16
  • 打赏
  • 举报
回复
网络高手,帮忙解决~~~
linux下的组播~
OpenHero 2008-07-16
  • 打赏
  • 举报
回复
现在的情况:
在client端,同时起两个client 分别等待224.1.1.3 12345 和224.1.1.2 12345
在windows中,可以分别接受到这两个组的数据;
在linux中,两个client混合接收到这两个组的数据;

当停掉一个server;
windows中,负责监听相应的client就会停止;
linux中,两个继续运行……crazy!!! 都接受另一个server的数据;

为什么会这样?
加载更多回复(26)
2006年06月21日 ---------最新要求-------------------- 1:操作系统必须安装WINDOWS XP,不建议安装win2000系统,如果必须采用win2000系统,建议联系本公司。 2:建议重新下载说明书,并详细阅读。 3:演示台标在操作完成第6布后自动安装在:C:\台标\下,可以直接使用。 更新时间:2006年08月21日。 适用板卡:TOPACK系列板卡 本次软件升级更新的内容 1:节目单编排程序:导入在播变化了的最新节目单。 2:播出程序:在播出过程中,导入最新动态节目单。 3:主备之间同步:主播工作站在播出过程中,操作播出、急切、跳切、延时动作,备机会自动做同样的操作。 ----------------------------- 不建议安装win2000系统的理由: 1:需要单独对数据库进行升级。 2:需要对操作系统的媒体播放器升级到9.0以上 3:对160G以上硬盘支持不好 ----------------------------- SIGA 硬 盘 播 出 2.0 软 件安 装 说 明 ----------- 安 装 包 说 明 ------------------- 1:本程序是2.0 安装包。 --- 硬 盘 播 出 系 统 安 装 步 骤 说 明 ----- 播出工作站软件安装 主机配置的软硬件需求: 硬件配置需求:CPU P4 2.4、系统内存512M以上。 软件配置需求:安装操作WINDOWS XP操作系统。如果主机的操作系统为WINDOWS 2000,在安装前请联系本公司。 播出软件的安装: 软件安装为六个步骤,建议按照步骤逐步安装,不要交换安装次序。安装盘为6个文件夹,依次为:第一步、第二步……第六步,每个文件夹中都有详细安装图说明,现在对每一步的安装重点进行解绍。 第一步:安装操作WINDOWS XP操作系统,并安装升级补丁和主板驱动。 第二步:安装驱动程序。 1:安装播出卡驱动:必须使用指定的驱动程序。 2:安装mpeg2软解码器驱动:安装Elecard MPEG2 Player 播放器。 3:升级微软的媒体播放器在9.0以上。 第三步:安装SQL2000大型数据库。 1:请使用本公司提供的安装光盘安装直接安装。 2:不能将SQL光盘数据复制到硬盘后从硬盘安装。 3:严格按照安装图例进行安装,在安装过程中只需修改三个地方,不要任意修改其他设置。 4:将SQL光盘数据复制到硬盘,从系统硬盘进行安装,需要一定技巧,方法是先将保存SQL数据的文件夹映射成为 一个盘,在这个虚拟盘上进行安装。 第四步:安装DirectX8.1或更高的9.0。 1:安装完成后重新启动计算机。 2:如果不安装,会导致播出系统无法找到出点和入点。 第五步:安装SIGA硬盘播出系统后台数据。 运行“原始播出数据创建-win XP.exe”安装程序。自动弹出附加数据库菜单,点击“创建数据库”按钮,系统 将自动创建原始数据。创建完成后,需要对创建的数据库进行查看,是否创建成功,查看的方法请看图例“数据 库安装的检测图例1-8.bmp”,查看操作只是检查操作,可以不操作。 第六步:安装播出程序: 直接运行“播出安装.exe”,安装过程中会提示安装软件狗驱动。 ------ 如 何 检 查 播 出 是 否 安 装 成 功 ------- 数据库的检测:在数据源ODBC测试SIGA是否通过,参看图例“ODBC配置图例1-9.jpg” ----------- 播 出 的 文 件 说 明 ----------- 运行程序在C:\Program Files\硬盘播出系统\下 1:播出程序: 如果用户是“全硬盘播出狗”狗,请用“SIGA_Pro_1000.exe”程序 如果用户是“盘带播控RELMAgic系列”狗,请用“SIGA_Pro_2000.exe”程序 2:节目单编排程序:节目单编排.exe 3:数据库注册工具:SIGA.reg 4:修改播出卡输出设置工具:Adjust32.exe 5:板卡测试工具:节目测试-SIGA.EXE 6:节目单数据:SIGA_Data.MDF和SIGA_Log.LDF文件(在C:\Program Files\Microsoft SQL Server\MSSQL\Data\下) 7:导出保存播出数据:在 开始 - 程序 - Microsoft SQL Server - 企业管理器 - 参看图例 ------- 节 目 单 编 排 的 操 作 说 明 ------------ 1:管理员的密码:123456 2:节目的快速添加:Ctrl+鼠标左键点击视频文件,可以将节目直接添加入节目单。 3:更改某条节目:双击鼠标左键,直接更该条节目。 4:电视剧中间插播广告:方法为:1)设置节目的出入点办法。2)右键弹出"割"按钮办法。 5:多个定时文件播出:用“接定时”将文件组合在一起。 ------- 硬 盘 播 出 的 操 作 说 明 ------------ 1:紧急插播节目:选择应急按钮后,选择一个应急节目,5秒后节目播出。 2:临时变更节目单:点击“节目单”即可更新 3:节目预览,选中一条节目,用鼠标左键双击,小窗口播出该条节目。 4:播出中临时改变节目单:右键弹出“替换节目”“删除”“添加”按钮,可以对节目进行添加、删除、替换处理。 5:节目单报错:播出程序的“播出纪录”里面有显示,根据显示的内容进行处理。 6:按设定的声道播出:在节目单中设置声道,播出中根据设置的声道自动选择播出的声道。 7:断点续播:播出严格按照时间播出,自动断点播出。 --------------- 主 备 同 步 说 明 -------------------- 1:主备机别安装主播出程序。 2:创建并配置备播节目存储路径。 1):在备播上创建一个文件夹并共享(用于保存所有备播节目)。如为:Z:\备播节目文件\ 2):打开编辑C:\Program Files\硬盘播出系统\下的siga.ini文件。 3):修改siga.ini字段:LOCAL_LIB=Z:\备播节目文件\;(“Z:\备播节目文件\”为举例路径) 3:更改备播配置文件,主播勿需更改配置。 1):打开编辑C:\Program Files\硬盘播出系统\下的siga.ini文件。 2):修改siga.ini字段: MASTER=FALSE( MASTER字段等于:TRUE为主播模式;FALSE为备播模式) 4:启动主备同步文件复制程序。 1):在主播或节目单编排机上启动“主备同步.exe”程序 2):主备同步程序。每隔30秒自动根据日期,将节目单上的节目完全复制到备播,包括以前有但是重新制作的节目。 ------------- 同 步 字 幕 安 装 ---------------- 1:安装字幕补丁:运行“字幕补丁.EXE” -------------- 故 障 问 答 --------------------- 1:播出机不能从断点播出 没有安装 DX8.1和注册控件,需要安装DX8.1和注册控件(双击C:\Program Files\硬盘播出系统\Reg.bat文件 ) 2: 安装好后,频繁死机 估计原因:1)没有安装SQL2000的升级补丁;2)播出卡驱动版本不配套。 3:节目播出为N制节目 运行C:\Program Files\硬盘播出系统\Adjust32.exe,直接修改节目播出属性为PAL 4:漏播3-7秒的硬盘节目 修改播出软件的配置:系统配置 - 硬盘 - 设备预处理时间 - 3000 - 修改信息(根据计算机的速度而定) 5:变更播出菜单底图: 修改:C:\Program Files\硬盘播出系统\Background.bmp文件 6:导出节目单数据 开始 - 程序 - Microsoft SQL Server - 企业管理器 - 参看图例 7:如何彻底删除播出程序 1):卸载播出程序 2):删除SIGA数据库数据 3):删除SIGA在ODBC中的配置 8:重新安装播出程序 1):卸载播出程序 2):导出播出数据(根据需要是否保留现有播出数据) 3):彻底删除SIGA数据库数据 4):在SQL中重建SIGA数据 5):重新安装播出程序

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧