㈠ 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) {
}
}
}
}
}