㈠ c# 组播 知道的朋友请帮帮忙。

- -!C#里为什么还用Socket呢.MS已经帮着封装好了UdpClient了.

给你一个自己写的类.你看看就明白了.

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Windows.Forms;
using System.Threading;

namespace LanMessenger
{
public class UdpSocket
{
private static UdpClient _msgClient;
private static UdpClient _fileSendClient;
private static UdpClient _fileReceiveClient;

private static int _msgPort = 6868;
private static int _fileSendPort = 6867;
private static int _fileReceivePort = 6869;

private static IPAddress _groupIpAddress = IPAddress.Parse("224.0.0.101");
private static string _localIpAddress = "127.0.0.1";
public static string LocalIpAddress
{
get { return _localIpAddress; }
}

private static IPEndPoint _remoteEP = null;

/// <summary>
/// 初始化套接字
/// </summary>
public static void InitSocket()
{
_localIpAddress = GetLocalIpAddress();
_msgClient = new UdpClient(_msgPort);
_fileSendClient = new UdpClient(_fileSendPort);
_fileReceiveClient = new UdpClient(_fileReceivePort);

_msgClient.EnableBroadcast = true;
_msgClient.MulticastLoopback = true;
_msgClient.JoinMulticastGroup(_groupIpAddress);
}

/// <summary>
/// 获取本机IP地址
/// </summary>
/// <returns>本机的IP地址</returns>
private static string GetLocalIpAddress()
{
string ip = "127.0.0.1";
IPAddress [] ipAddresss = Dns.GetHostAddresses(Dns.GetHostName());
foreach (IPAddress ipAddress in ipAddresss)
{
ip = ipAddress.ToString();
if (ip != "127.0.0.1")
{
break;
}
}
return ip;
}

/// <summary>
/// 组播消息
/// </summary>
/// <param name="buffer">要发送的byte数组</param>
public static void SendMsgToAll(byte[] buffer)
{
try
{
_msgClient.Send(buffer, buffer.Length, new IPEndPoint(_groupIpAddress, _msgPort));
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}

/// <summary>
/// 发送消息给指定机器
/// </summary>
/// <param name="buffer">要发送的byte数组</param>
/// <param name="remoteIpAddress">对方机器IP地址</param>
public static void SendMsgToOne(byte[] buffer,string remoteIpAddress)
{
try
{
_msgClient.Send(buffer, buffer.Length, new IPEndPoint(IPAddress.Parse(remoteIpAddress), _msgPort));
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}

/// <summary>
/// 监听消息端口,该函数为线程函数
/// </summary>
public static void ListenMessagePort()
{
try
{
while (true)
{
byte[] buffer = _msgClient.Receive(ref _remoteEP);
Thread thread = new Thread(new ParameterizedThreadStart(SocketHandler.OnReceiveMsg));
thread.Start((object)buffer);
}
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
}
}

补充:那是我自己的处理函数.每个人的处理逻辑不一样.我给你你也用不了. 我还是附上吧.你肯定用不了.你那个地方写个线程函数来处理其实就可以了

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Threading;
using System.Runtime.Serialization.Formatters.Binary;
using System.Windows.Forms;

namespace LanMessenger
{
public class SocketHandler
{
/// <summary>
/// 提供序列化和反序列话方法的对象
/// </summary>
private static BinaryFormatter Transfer = new BinaryFormatter();
public delegate void MessageHandler(MessageEventArgs e);
public static event MessageHandler OnUserOnline;
public static event MessageHandler OnUserOffline;
public static event MessageHandler OnUserChangeInfo;
public static event MessageHandler OnReceiveMessage;

/// <summary>
/// 将Socket接受到的byte转化成可识别的Message对象
/// </summary>
/// <param name="buffer">Socket接受到的byte</param>
private static Message ChangeByteToMessage(byte[] buffer)
{
try
{
//将加密消息转化为正常消息
byte[] decodebuffer = Kits.CryptTo.Decrypt.TripledDESDecrypt(buffer, SysConst.TriDesKey);
MemoryStream ms = new MemoryStream(decodebuffer, 0, decodebuffer.Length, true, true);
//将接收到的流反序列化为对象
object obj = Transfer.Deserialize(ms);

return (Message)obj;
}
catch (Exception err)
{
return null;
}
}

/// <summary>
/// 将Message对象转化成byte
/// </summary>
/// <param name="msg"></param>
/// <returns>转化成的byte</returns>
private static byte[] ChangeMessageToByte(Message msg)
{
MemoryStream ms = new MemoryStream();
//将消息对象序列化
Transfer.Serialize(ms, (object)msg);
byte[] buffer = ms.GetBuffer();
//进行3DES加密
byte[] encodebuffer = Kits.CryptTo.Encrypt.TripledDESEncrypt(buffer, SysConst.TriDesKey);

return encodebuffer;
}

/// <summary>
/// 启动Message监听
/// </summary>
public static void BeginListenMessage()
{
Thread thread = new Thread(new ThreadStart(UdpSocket.ListenMessagePort));
thread.Start();
}

/// <summary>
/// 接收消息处理函数
/// </summary>
/// <param name="obj"></param>
public static void OnReceiveMsg(object obj)
{
try
{
byte[] buffer = (byte[])obj;
Message msg = ChangeByteToMessage(buffer);
MessageTypeHandler(msg);
}
catch (Exception err)
{
return;
}
}

/// <summary>
/// 消息分类函数
/// </summary>
/// <param name="msg">Socket接收到的消息</param>
private static void MessageTypeHandler(Message msg)
{
switch (msg.Protrol)
{
case ProtrolType.GetOnline: UserOnlineHandler(msg);
break;
case ProtrolType.GetOffine: UserOfflineHandler(msg);
break;
case ProtrolType.ChangeUserInfo: ChangeUserInfoHandler(msg);
break;
case ProtrolType.SendMessage: GetMessageHandler(msg);
break;
default: throw new Exception("An Unknow Message Protrol Received!");
}
}

private static void UserOnlineHandler(Message msg)
{
MessageEventArgs e = new MessageEventArgs(msg);
OnUserOnline(e);
}

private static void UserOfflineHandler(Message msg)
{
MessageEventArgs e = new MessageEventArgs(msg);
OnUserOffline(e);
}

private static void ChangeUserInfoHandler(Message msg)
{
MessageEventArgs e = new MessageEventArgs(msg);
OnUserChangeInfo(e);
}

private static void GetMessageHandler(Message msg)
{
MessageEventArgs e = new MessageEventArgs(msg);
OnReceiveMessage(e);
}

/// <summary>
/// 组播消息
/// </summary>
/// <param name="msg">要发送的消息</param>
public static void SendMessageToAll(Message msg)
{
byte[] buffer = ChangeMessageToByte(msg);
UdpSocket.SendMsgToAll(buffer);
}

/// <summary>
/// 发消息给指定IP
/// </summary>
/// <param name="msg">消息体</param>
/// <param name="ip">对方IP</param>
public static void SendMessageToOne(Message msg,string ip)
{
byte[] buffer = ChangeMessageToByte(msg);
UdpSocket.SendMsgToOne(buffer,ip);
}
}

public class MessageEventArgs : EventArgs
{
public Message message;

public MessageEventArgs()
{

}

public MessageEventArgs(Message msg)
{
this.message = msg;
}
}
}

㈡ 如何创建组播应用程序

在网络中,主机间可以用三种不同的地址进行通信:

单播地址(unicast):即在子网中主机的唯一地址(接口)。如IP地址MAC地址:
80:C0:F6:A0:4A:B1。

广播地址:这种类型的地址用来向子网内的所有主机(接口)发送数据。如广播IP地址是
,MAC广播地址:FF:FF:FF:FF:FF。

组播地址:通过该地址向子网内的多个主机即主机群(接口)发送数据。

如果只是向子网内的部分主机发送报文,组播地址就很有用处了;在需要向多个主机发送多媒体信息
(如实时音频、视频)的情况下,考虑到其所需的带宽,分别向每一客户端主机发送数据并不是个好办法,如
果发送主机与某些接收端的客户主机不在子网之内,采用广播方式也不是一个好的解决方案。

㈢ 华为机顶盒iptv突然不能播放了,“错误代码30049,请用组播方式登录。”运营商是联通。求解答。

把所的设置重置。

1、首先在机顶盒的遥控器上按一下设置键,会提示输入密码,我们输入6321,就会进入机顶盒设置界面后找到业务认证界面。

㈣ 如何用两台电脑测试组播代码

用抓包分析软件啊,一台电脑也可以啊(装个虚拟机)

㈤ 组播是不是只能用UDP协议,不能用TCP协议

1、首先看TCP/UDP的英文缩写可以知道,他们都有一个P字母,也就是协议的英文,说明他们都是表示一种协议的规则。而单播、广播、组播则表示的是数据在网络中“播放”的形式,是指有一个人能听到还是让特定的人群听得到,还是让所有的人都听的到的区别。UDP支持单播、组播和广播,而TCP不支持广播。2、理论上讲路由器和路由器连接要使用的是交叉线。3、你使用的网页程序和提交的所有数据都是存储在的服务器上,管理员可以通过多种方式对任何内容进行无限制的修改。大部分的方式是采用不同用户对数据的操作权限不同来进行区别的,因为这样对程序和数据都最安全。这里先简单的说一下TCP与UDP的区别:1。基于连接与无连接2。对系统资源的要求(TCP较多,UDP少)3。UDP程序结构较简单4。流模式与数据报模式5。TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证另外结合GPRS网络的情况具体的谈一下他们的区别:1。TCP传输存在一定的延时,大概是1600MS(移动提供),UDP响应速度稍微快一些。2。TCP包头结构源端口16位目标端口16位序列号32位回应序号32位TCP头长度4位reserved6位控制代码6位窗口大小16位偏移量16位校验和16位选项32位(可选)这样我们得出了TCP包头的最小大小.就是20字节.UDP包头结构源端口16位目的端口16位长度16位校验和16位UDP的包小很多.确实如此.因为UDP是非可靠连接.设计初衷就是尽可能快的将数据包发送出去.所以UDP协议显得非常精简.

㈥ 有谁能给我贴一份可用的 UDP 组播代码吗

组播技术可形象的描述如下:
假设一个企业分布于各地的子公司(两个以上)之间需要通过Internet进行实时的交换信息(数据,声音,图像),他们的计算机可能不属于同一物理网 络,甚至不属于同一自治系统,这种通信的特点是“多点”式的。子公司发出的数据希望其他子公司都能收到,而总部发出的指示全体子公司都应收到。这种多点通信方式为组内广播,即组播技术,也称多播技术,多目网关技术。
1.2、TCP/IP传送方式
组播技术是TCP/IP传送方式的一种。在我们讨论组播技术之前先来看看TCP/IP传送方式。TCP/IP传送方式有三种:单播,广播,组播。
单播(Unicast)传输:在发送者和每一接收者之间需要单独的数据信道。 如果一台主机同时给很少量的接收者传输数据,一般没有什么问题。但如果有大量主机希望获得数据包的同一份拷贝时却很难实现。这将导致发送者负担沉重、延迟长、网络拥塞;为保证一定的服务质量需增加硬件和带宽。
组播(Multicast)传输:它提高了数据传送效率。减少了主干网出现拥塞的可能性。组播组中的主机可以是在同一个物理网络,也可以来自不同的物理网络(如果有组播路由器的支持)。
广播(Broadcast)传输:是指在IP子网内广播数据包,所有在子网内部的主机都将收到这些数据包。广播意味着网络向子网主机都投递一份数据包,不论这些主机是否乐于接收该数据包。然而广播的使用范围非常小, 只在本地子网内有效,因为路由器会封锁广播通信。广播传输增加非接收者的开销。
组播是一种允许一个或多个发送者(组播源)发送单一的数据包到多个接收者(一次的,同时的)的网络技术。 组播源把数据包发送到特定组播组,而只有属于该组播组的地址才能接收到数据包。组播可以大大的节省网络带宽, 因为无论有多少个目标地址,在整个网络的任何一条链路上只传送单一的数据包。 它提高了数据传送效率。减少了主干网出现拥塞的可能性。组播组中的主机可以是在同一个物理网络, 也可以来自不同的物理网络(如果有组播路由器的支持)。

㈦ QT UDP 编程,QT是否支持Source Specific Multicast(SSM)源特定组播,具体实现代码O(∩_∩)O谢谢

Qt 有函数可以加入组播的.不过要Qt 4.8 或以上的版本才有....
bool joinMulticastGroup(const QHostAddress & groupAddress)

java如何实现网络组播的应用软件

(1)、创建一个组播组。
(2)、加入组播组。
(3)、向组播组发送数据。
(4)、从组播组接收数据并显示。
(5)、离开组播组。
程序具体实现是创建一个框架类和一个包含main()方法的应用程序类,类名分别为WBFrame和WBUser其Java文件名是WBFrame.java和WBUuser.java。其中WBFrame.java主要代码如下:
void jButton2_actionPerformed(ActionEvent e)

㈨ 40、在Java中,如何实现组播通信

编辑一个java组播应用程序的过程如下

1. 创建一个用于发送和接收的MulticastSocket组播套接字对象
2. 创建一个指定缓冲区大小及组播地址和端口的DatagramPacket组播数据包对象
3. 使用组播套接字joinGroup(),将其加入到一个组播
4. 使用组播套接字的send()方法,将组播数据包对象放入其中,发送组播数据包.
或者
使用组播套接字的receive()方法,将组播数据包对象放入其中,接收组播数据包
5. 解码组播数据包提取信息,并依据得到的信息作出响应String s = new String(dp.getData(), 0, dp.getLength());
6. 重复过程4和5,即在while循环中实现。
7. 使用组播套接字的leaveGroup()方法,离开组播组;关闭组播套接字

接收组播数据包程序:
Java代码
public class MulticastReceived {

public static void main(String[] args) throws Exception {
InetAddress group = InetAddress.getByName("224.0.0.4"); // 组播地址
int port = 4006; // 端口
MulticastSocket msr = null;
try {
msr = new MulticastSocket(port); // 1.创建一个用于发送和接收的MulticastSocket组播套接字对象
msr.joinGroup(group); // 3.使用组播套接字joinGroup(),将其加入到一个组播
byte[] buffer = new byte[8192];
System.out.println("接收数据包启动!(启动时间:)" + new java.util.Date() + ")");
while (true) {
DatagramPacket dp = new DatagramPacket(buffer, buffer.length); // 2.创建一个指定缓冲区大小及组播地址和端口的DatagramPacket组播数据包对象
msr.receive(dp); // 4.使用组播套接字的receive()方法,将组播数据包对象放入其中,接收组播数据包
String s = new String(dp.getData(), 0, dp.getLength()); // 5.解码组播数据包提取信息,并依据得到的信息作出响应
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();

} finally {
if (msr != null) {
try {
msr.leaveGroup(group); // 7.使用组播套接字的leaveGroup()方法,离开组播组
msr.close(); // 关闭组播套接字
} catch (IOException e) {
}
}
}
}
}

发送组播数据包程序:
Java代码
public class MulticastSender {

public static void main(String[] args) throws Exception {
InetAddress group = InetAddress.getByName("224.0.0.1"); // 组播地址
int port = 4000; // 端口
MulticastSocket mss = null;
try {
mss = new MulticastSocket(port); // 1.创建一个用于发送和接收的MulticastSocket组播套接字对象
mss.joinGroup(group); // 3.使用组播套接字joinGroup(),将其加入到一个组播
byte[] buffer = new byte[8192];
System.out.println("接收数据包启动!(启动时间:)" + new java.util.Date() + ")");
while (true) {
String message = "Hello" + new java.util.Date();
byte[] buffer2 = message.getBytes(); // 2.创建一个指定缓冲区大小及组播地址和端口的DatagramPacket组播数据包对象

DatagramPacket dp = new DatagramPacket(buffer, buffer.length, group, port);
// msr.receive(dp); //接收组播数据包

mss.send(dp); // 4.使用组播套接字的send()方法,将组播数据包对象放入其中,发送组播数据包
// String s = new String(dp.getData(), 0, dp.getLength()); //5.解码组播数据包提取信息,并依据得到的信息作出响应
System.out.println("发送数据包给" + group + ":" + port);
Thread.sleep(1000);
}
} catch (IOException e) {
e.printStackTrace();

} finally {
if (mss != null) {
try {
mss.leaveGroup(group); // 7.使用组播套接字的leaveGroup()方法,离开组播组
mss.close(); // 关闭组播套接字
} catch (IOException e) {
}
}
}
}
}