精华内容
参与话题
问答
  • 基于UDP的多播(组播)文件传输

    千次阅读 2019-04-20 00:34:54
    此次的课程设计通过借鉴网上的信息(前人种树后人乘凉,感谢在网上分享的大佬们)然后自己再次修改调试完成。 步入正题吧 主要代码: public class MULTICAST { private String cachePath="D:\\Network\\CC1\\...

    此次的课程设计通过借鉴网上的信息(前人种树后人乘凉,感谢在网上分享的大佬们)然后自己再次修改调试完成。

    步入正题吧

    主要代码:

    public class MULTICAST {
    
    	private String cachePath="D:\\Network\\CC1\\";
    	SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");//设置日期格式
    	public String BC_IP;// = "228.5.6.7"; // 组播地址
    	public int BC_PORT;// = 4567; // 组播端口
    	private final static int PACK_SIZE = 1024;
    	private byte[] buffer = new byte[PACK_SIZE];
    	
    	public String msg=null;
    	public String input=null;
    	private InetAddress bcAddr = null;
    	private MulticastSocket sock=null;// 接收文件来显提示
    	private MulticastSocket socket1=null;// 接收文件信息
    	String filename = null;
    	int fileLen = 0;
    	int numofBlock = 0;
    	int lastSize = 0;
    	
    	MULTICAST(){}
    	
    	MULTICAST(String addr,String port){
    		
    		BC_IP=addr;
    		BC_PORT=Integer.parseInt(port);
    		
    		try {
    			/*实例化InetAddress,指定接收地址*/
    			sock = new MulticastSocket(BC_PORT);
    			socket1 = new MulticastSocket(BC_PORT + 1);
    			socket2 = new MulticastSocket(BC_PORT + 2);
    			/*(绑定多点广播套接字)创建一个用于接收的MulticastSocket组播套接字对象*/
    			bcAddr = InetAddress.getByName(BC_IP);
    			/*使用组播套接字joinGroup(),将其加入到一个组播*/
    			sock.joinGroup(bcAddr);
    			socket1.joinGroup(bcAddr);
    
    			sock.setTimeToLive(1);
    			  
    			msg="启动!<启动时间:" + new Date() + ">";
    			Received.textArea.setText(msg+"\n");
    			rev();
    			
    		} catch (IOException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
    		
    	}
    	
    	public void rev() throws IOException{
    		new Thread(() -> {
    		while (sock!=null) {
    			try {
    				//
    				byte filetipBuf[] = new byte[256];// 防止文件名字过长(此处最长256个字符)
    				DatagramPacket packet_tip = new DatagramPacket(filetipBuf,0, filetipBuf.length);
    				sock.receive(packet_tip);
    				String str_filetip = new String(packet_tip.getData(), 0,packet_tip.getLength());
    				filename = str_filetip.substring(8);
    				//Received.textArea.append(df.format(new Date())+str_filetip + "\n");				
    				// 接收文件长度(字节数)
    				byte[] fileLenBuf = new byte[12];// 可以传输1T的文件
    				DatagramPacket packet_len = new DatagramPacket(fileLenBuf,fileLenBuf.length);
    				socket1.receive(packet_len);
    				String str_fileLen = new String(fileLenBuf, 0,packet_len.getLength());
    				fileLen = Integer.parseInt(str_fileLen);
    				//Received.textArea.append(df.format(new Date())+"文件大小: " + fileLen + "字节, " + (float)(fileLen / 1024) + "kb, " + (float)(fileLen / 1024 / 1024) + "Mb\n");
    				//
    				DatagramPacket packet_file = new DatagramPacket(buffer, 0,buffer.length);
    				numofBlock = fileLen / buffer.length;// 循环次数(将该文件分成了多少块)
    				lastSize = fileLen % buffer.length;// 最后一点点零头的字节数
    				File file = new File(cachePath + filename);
    				FileOutputStream fos = new FileOutputStream(file);// 从内存取出存入文件
    				for (int i = 0; i < numofBlock; i++) {
    					packet_file = new DatagramPacket(buffer, 0,
    							buffer.length);
    					socket1.receive(packet_file);// 通过套接字接收数据
    					fos.write(buffer, 0, 1024);// 写入文件
    				}
    				// 接收最后一点点零头
    				packet_file = new DatagramPacket(buffer, 0, lastSize);
    				socket1.receive(packet_file);// 通过套接字接收数据
    				fos.write(buffer, 0, lastSize);// 写入文件
    				fos.close();
    				
    				Received.textArea.append(df.format(new Date())+str_filetip + "\n");
    				Received.textArea.append(df.format(new Date())+"文件大小: " + fileLen + "字节, " + (float)(fileLen / 1024) + "kb, " + (float)(fileLen / 1024 / 1024) + "Mb\n");
    				// 反馈包
    			} catch (Exception e) {
    				System.out.println(e);
    			}
    		}
    		}).start();
    	}
    	
    	
    	public void run(File file0) throws IOException {	
    		try {
    			File file = file0;
    			try {
    				// 将文件名发送过去
    				String str_filename = file.getName();
    				String str_tip = "有文件,请处理:" + str_filename;
    				byte[] fileNameBuf = str_tip.getBytes();
    				MulticastSocket socket = new MulticastSocket();
    				DatagramPacket packet = new DatagramPacket(fileNameBuf, fileNameBuf.length,bcAddr, BC_PORT);
    				socket.send(packet);
    				socket.close();
    				//
    				FileInputStream fis = new FileInputStream(
    						file);// 从文件中取出写入内存
    				// 将文件长度发送过去
    				int fileLen = fis.available();
    				String str_len = "" + fileLen;
    				byte[] fileLenBuf = str_len.getBytes();
    				socket = new MulticastSocket();
    				packet = new DatagramPacket(fileLenBuf,fileLenBuf.length, bcAddr,BC_PORT+1);
    				socket.send(packet);
    				socket.close();
    				
    				// 发送文件主体
    				byte[] buf = new byte[1024];
    				int numofBlock = fileLen / buf.length;// 循环次数(将该文件分成了多少块)
    				int lastSize = fileLen % buf.length;// 最后一点点零头的字节数
    				socket = new MulticastSocket();
    				for (int i = 0; i < numofBlock; i++) {
    					fis.read(buf, 0, buf.length);// 写入内存
    					packet = new DatagramPacket(buf,buf.length, bcAddr,BC_PORT+1);
    					socket.send(packet);
    					Thread.sleep(1); // 简单的防止丢包现象
    				}
    				// 发送最后一点点零头
    				fis.read(buf, 0, lastSize);
    				packet = new DatagramPacket(buf,buf.length, bcAddr,BC_PORT+1);
    				socket.send(packet);
    				Thread.sleep(1); // 简单的防止丢包现象
    				fis.close();
    				socket.close();
    				Received.textArea.append(df.format(new Date())+" 文件传输完毕!"+"\n");
    				Received.textField.setText("");
    			} catch (Exception ev) {
    				System.out.println(ev);
    			}
    		} catch (Exception ex) {
    			JOptionPane.showMessageDialog(null,"打开文档出错!");
    		}
    	}
    	
    	public void save_as() {
    		// 选择要接收的文件
    		JFileChooser filechooser = new JFileChooser();
    		int result = filechooser.showSaveDialog(null);
    		if (result == JFileChooser.APPROVE_OPTION) {
    			try {
    				File file2 = filechooser.getSelectedFile();
    				String file2Name=file2.getName();
    				try {
    					File file1 = new File(cachePath + "\\" + file2Name);
    					saveAs(file1, file2);
    					//
    					Received.textArea.append(df.format(new Date())+" 文件接收完毕!"+"\n");
    					Received.textArea.append(df.format(new Date())+" 文件已处理!!"+"\n");
    				} catch (Exception ex) {
    					System.out.println(ex);
    				}
    			} catch (Exception ex) {
    				JOptionPane.showMessageDialog(null,"打开保存出错!");
    			}
    		}
    	}
    	
    	public void saveAs(File file1, File file2) {// 把file1另存为file2,并删掉file1
    		try {
    			FileInputStream fis = new FileInputStream(file1);
    			FileOutputStream fos = new FileOutputStream(file2);
    			byte buf[] = new byte[1024];
    			int len = 0;
    			while ((len = fis.read(buf)) != -1) {
    				fos.write(buf, 0, len);
    			}
    			fis.close();
    			fos.close();
    			file1.delete();
    		} catch (Exception ex) {
    			System.out.println(ex);
    		}
    	}
    	
    	public void leave() throws IOException {
    		sock.leaveGroup(bcAddr);
    		socket1.leaveGroup(bcAddr);
    		socket2.leaveGroup(bcAddr);
    	}
    	
    	public void exit0() throws IOException {
    		sock.close();
    		socket1.close();
    		socket2.close();
    	}
    
    }

    运行结果展示:

    发送端:

    接收端:

    接收文件后:

    总结:完成了UDP多播文件传输,但是没有考虑和完成可靠传输的问题。关于多播文件传输时遇到主机之间传输失败的问题请看我的另一篇文章https://blog.csdn.net/TanCairo/article/details/89410340

    END!!!

    展开全文
  • QT UDP组播的实现

    热门讨论 2014-04-18 16:53:31
    QT实现UDP的接收和发送,包括组播的加入和相关操作
  • QT实现UDP通信,分客户端、服务端进行数据收发。包含单播、多播、组播
  • QT实例:UDP组播通信

    千次阅读 2019-09-17 10:19:49
    QT += core gui network 2.添加头文件 #include <QUdpSocket> 3.在.h文件private私有变量中添加定义 QUdpSocket *m_qudpSocket; 4.在.cpp中的构造函数中添加 m_qudpSocket = new QUdpSocket(); ...

    一、发送方

    1.在pro工程文件中添加代码

    QT += core gui network

    2.添加头文件

    #include <QUdpSocket>

    3.在.h文件private私有变量中添加定义

    QUdpSocket *m_qudpSocket;

    4.在.cpp中的构造函数中添加

    m_qudpSocket = new QUdpSocket();

    5.添加按钮,并将按钮转到槽函数clicked(),如下代码

    void MainWindow::on_pushButton_clicked()
    {   
       m_qudpSocket->writeDatagram(ui->textEditSendData->toPlainText().toUtf8(),QHostAddress("127.0.0.1"),8080);           
    }

    6.效果图

    二、接收方

    1.重复发送方的1~4步(注意两者的socket变量不一样)

    2.构造函数中继续添加以下代码

    m_udpSocket->bind(QHostAddress::AnyIPv4,8080,QUdpSocket::ShareAddress);//绑定所有ip来接收组播组信息    
    m_udpSocket->joinMulticastGroup(QHostAddress("127.0.0.1"));//加入组播组ip  
    m_udpSocket->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption,1024*1024*8);//设置缓冲区    
    connect(m_udpSocket,SIGNAL(readyRead()),this,SLOT(RecvData()));//连接接收信号槽

    3.添加槽函数代码

    void MainWindow::RecvData()
    {    
    //数据报到来,readyRead()信号被产生,此时hasPendingDatagrams()函数返回真(true)。    
    //调用pendingDatagramSize()获取第一个数据报的长度(size),readDatagram()读取数据报内容    
       while (m_udpSocket->hasPendingDatagrams())           
        {               
          QByteArray datagram;               
          datagram.resize(m_udpSocket->pendingDatagramSize());               
          m_udpSocket->readDatagram(datagram.data(),datagram.size());
          QString strRecvData = datagram;
          ui->textEditRecvData->setPlainText(strRecvData);
          qDebug()<<datagram.data();           
       }
    }

    4.然后在private slots中添加槽函数声明

     void RecvData();

    注意:127.0.0.1是回环地址,当接收方和发送方的IP和端口相同时,接收方可以收到发送方发来的消息,用以验证。

    参考文档:QT进行UDP通信的学习(单播,组播,广播)

    展开全文
  • 使用Qt5.11.2的官方例子,在ubuntu18.04的虚拟机下向239.255.255.250 去发送组播可以发送出去。 但是在windows7下使用这个版本的官方例子怎么向239.255.255.250发送组播包就发不出去呢?wirshark就住不到包.哪位...
  • UDP 组播---你需要了解这些

    千次阅读 2019-08-06 17:59:40
    数据传输方式主要分为单播、广播、组播,不同的传输方式各有其优劣性。 另外感觉7层OSI协议,在软件上实现其实是很简单的,现在OSI模型把每一层该做的事情都区分的清清楚楚,一层处理完交给下一层,层层递进,互不...

    我的小结 

    UDP是面向无连接的协议,不能保证数据的可靠到达,但相应的,实时性较于TCP好了不是一个数量级。这回主要得用到组播。但下午实验的时候,没有组出效果,可能得连上路由器才行吧。

    数据传输方式主要分为单播、广播、组播,不同的传输方式各有其优劣性。

    另外感觉7层OSI协议,在软件上实现其实是很简单的,现在OSI模型把每一层该做的事情都区分的清清楚楚,一层处理完交给下一层,层层递进,互不干扰。


    先来了解下UDP

    UDP 是UserDatagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。

    UDP和TCP的区别:http://blog.csdn.net/ljheee/article/details/50823050

    UDP详解:http://blog.csdn.NET/ljheee/article/details/51720594

     

    UDP信息传递的方式分三类

    ①  单播Unicast:是客户端与服务器之间的点到点连接。

    ②  广播BroadCast:主机之间“一对所有”的通讯模式,广播者可以向网络中所有主机发送信息。广播禁止在Internet宽带网上传输(广播风暴)。

    ③  多播MultiCast:主机之间“一对一组”的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据。

    这里需要注意的是:只有UDP才有广播、组播的传递方式;而TCP是一对一连接通信。多播的重点是高效的把同一个包尽可能多的发送到不同的,甚至可能是未知的设备。但是TCP连接是一对一明确的,只能单播。

     

    Java API中,实现UDP方式的编程,包含客户端网络编程和服务器端网络编程,主要由两个类实现,分别是:DatagramSocket和DatagramPacket。

     

    关于UDP使用的详细例子:https://github.com/ljheee/ChatUDP

     

    UDP组播

             组播报文的目的地址使用DIP地址, D类地址不能出现在IP报文的源IP地址字段。单播数据传输过程中,一个数据包传输的路径是从源地址路由到目的地址,利用“逐跳”的原理[路由选择]在IP网络中传输。

            然而在ip组播环中,数据包的目的地址不是一个,而是一组,形成组地址。所有的信息接收者都加入到一个组内,并且一旦加入之后,流向组地址的数据立即开始向接收者传输,组中的所有成员都能接收到数据包。组播组中的成员是动态的,主机可以在任何时刻加入和离开组播组。

            用同一个IP多播地址接收多播数据包的所有主机构成了一个主机组,也称为多播组。一个多播组的成员是随时变动的,一台主机可以随时加入或离开多播组,多播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个多播组。此外,不属于某一个多播组的主机也可以向该多播组发送数据包。  

    组播地址

    1. 组播组可以是永久的也可以是临时的。组播组地址中,有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的ip地址,组中的成员构成可以发生变化。永久组播组中成员的数量都可以是任意的,甚至可以为零。那些没有保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用。
    2. 224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;
    3. 224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;
    4. 224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;
    5. 239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。

            组播是一对多的传输方式,其中有个组播组的 概念,发送端将数据向一个组内发送,网络中的路由器通过底层的IGMP协议自动将数据发送到所有监听这个组的终端。至于广播则和组播有一些相似,区别是路由器向子网内的每一个终端都投递一份数据包,不论这些终端是否乐于接收该数据包。UDP广播只能在内网(同一网段)有效,而组播可以较好实现跨网段群发数据。

           UDP组播是采用的无连接,数据报的连接方式,所以是不可靠的。也就是数据能不能到达接受端和数据到达的顺序都是不能保证的。但是由于UDP不用保证数据 的可靠性,所有数据的传送效率是很快的。

     

    IGMP协议

          IGMP是IP组播的基础。在IP协议出现以后为了加入对组播的支持,IGMP产生了。IGMP所做的实际上就是告诉路由器,在这个路由器所在的子网内有人对发送到某一个组播组的数据感兴趣,这样当这个组播组的数据到达后面,路由器就不会抛弃它,而是把他转送给所有感兴趣的客户。假如不同子网内的A和B要 进行组播通信,那么位于AB之间的所有路由器必须都要支持IGMP协议,否则AB之间不能进行通信。

     

    组播的原理:

          组播首先由一个用户申请一个组播组,这个组播组被维护在路由器中,其他用户申请加入组播组,这样当一个用户向组内发送消息时,路由器将消息转发给组内的所有成员。如果申请加入的组不在本级路由中,如果路由器和交换机允许组播协议通过,路由器将申请加入的操作向上级路由提交。广域网通信要经过多级路由器和交换机,几乎所有的网络设备都默认阻止组播协议通过(只允许本网段内,不向上级提交),这使得广域网上实现组播有一定局限。

     

    UDP组播的基本步骤

    1. 建立socket
    2. socket和端口绑定
    3. 加入一个组播组
    4. 通过sendto / recvfrom进行数据的收发
    5. 关闭socket

    服务器和客户端必须都要加入相同的组播地址才可以

    多播数据报套接字类用于发送和接收 IP 多播包。MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主机的“组”的附加功能。

    多播组通过 D 类 IP 地址和标准 UDP 端口号指定。可以通过首先使用所需端口创建 MulticastSocket,然后调用 joinGroup(InetAddress groupAddr) 方法来加入多播组。

            在Java中,多播一样十分好实现,要实现多播,就要用到MulticastSocket类,其实该类就是DatagramSocket的子类,在使用时除了多播自己的一些特性外,把它当做DatagramSocket类使用就可以了。

            默认我们知道IP(UDP和TCP一样)可以把数据包在一个网络中发到另一个设备。更准确点就是IP把数据包从一个IP地址发到另一个IP地址。多播的决窍就是在同一时间把一个数据包发送到多个设备,可以把一个特定的IP地址指定为多播地址,并同时发送到多个设备。

            IP多播首先要知道的是只有UDP有多播,没有TCP多播这样的东西,为什么呢?多播的重点是高效的把同一个包尽可能多的发送到不同的,甚至可能是未知的设备。但是TCP连接可能要求丢包重发或者延时或重组顺序,这些操作可能非常消耗资源,不适于许多使用多播的应用场景。(同时多播不知道发出的包是不是已经到达,这个也导致不能使用TCP)。

     最后给出一个实例:https://github.com/ljheee/Multicast_UDP

    展开全文
  • QT版本:Qt 5.5.1 (MSVC 2013, 32 bit) Qt Creator版本:Qt Creator 3.5.1 (opensource) 系统:win10 1.打开QtCreator——新建项目——点击Application——Qt Widgets Application——choose 如图: 2. 项目...

    QT版本:Qt 5.5.1 (MSVC 2013, 32 bit)
    Qt Creator版本:Qt Creator 3.5.1 (opensource)
    系统:win10
    1.打开QtCreator——新建项目——点击Application——Qt Widgets Application——choose
    如图:
    在这里插入图片描述
    2. 项目名称输入QtUdpTest——一路点下一步
    3. 在QtUdpTest.pro中增加一行

    QT += core gui network
    

    4.在mainwindow.h中增加头文件

    #include <QUdpSocket>//注:必须先操作3再操作4,否则系统会提示 no such file or directory
    

    5.主界面如图设计:
    在这里插入图片描述
    一个供用户输入的要发送的信的textEdit,一个单播发送按钮,一个多播发送按钮,一个广播发送按钮

    一、 单播
    1.创建套接字
    在MainWindow.h中添加定义:

    QUdpSocket       *m_qudpSocket;
    

    在MainWindow 构造函数中添加:

    m_qudpSocket = new QUdpSocket(); 
    

    2.发送数据到制定的地址和端口号
    在pushButtonUnicast按钮添加clicked()曹信号,并在信号接收函数中添加如下代码:

    m_qudpSocket->writeDatagram(ui->textEditSendData->toPlainText().toUtf8(),QHostAddress("127.0.0.1"),3956);
    

    3.接收代码编写:
    在主界面添加一个Label,文字内容为RecvData:,添加一个TextEdit(取名为textEditRecvData),如下图:
    在这里插入图片描述
    在MainWindow构造函数中添加如下代码:

    quint16 nport = 3956;
    QString strIP = "127.0.0.1";
    m_qudpSocket->bind(QHostAddress(strIP),nport);//绑定本地接收端IP及端口(针对单播接收)
    connect(m_qudpSocket,SIGNAL(readyRead()),this,SLOT(RecvData()));
    

    在头文件中添加如下代码:

    public slots:
    void RecvData();

    在.cpp文件中添加如下代码::

    void MainWindow::RecvData()
    {
        QByteArray baRecv;
        while(m_qudpSocket->hasPendingDatagrams())
        {
            baRecv.resize(m_qudpSocket->pendingDatagramSize());
            m_qudpSocket->readDatagram(baRecv.data(),baRecv.size());
            QString strRecvData = baRecv;
            ui->textEditRecvData->setPlainText(strRecvData);
            qDebug()<<baRecv.data();
        }
        qDebug()<<"break\n";
    }
    

    执行程序,在SendData:右侧输入发送的数据内容,在RecvData:右侧会实时显示接收到的内容。
    软件流程为:通过m_qudpSocket向本机ip:127.0.0.1的3956端口发送数据,同时,m_qudpSocket绑定了本机的接收ip:127.0.0.1,接收端口:3956,所以是m_qudpSocket把发送和接收一起包办了,运行结果见下图:
    在这里插入图片描述

    二、 组播
    1.组播只有ip地址和单播有区别
    假设组播IP是:224.0.0.1
    在pushButtonMulticast按钮添加clicked()信号槽,并在信号接收函数中添加如下代码:

    m_qudpSocket->joinMulticastGroup(QHostAddress("224.0.0.10")); //加入组播ip:224.0.0.10
    m_qudpSocket->writeDatagram(ui->textEditSendData->toPlainText().toUtf8(),QHostAddress("224.0.0.10"),3956);
    

    注意:
    1、发送端既可以加入组播,也可以不加入组播;
    2、服务端绑定的ip地址必须是ipv4地址, QHostAddress::Any即是ipv4地址;
    3、组播ip必须是D类ip(A类IP段 1.0.0.0 到126.255.255.255 (0段和127段不使用)
    B类IP段 128.0.0.0 到191.255.255.255
    C类IP段 192.0.0.0 到223.255.255.255
    D类IP段 224.0.0.0 到 239.255.255.255。

    4、组播地址不能是224.0.0.1!
    5、本机ip地址与组播地址无关,可以根据自己喜好随意配置!
    2. 接收代码编写:
    在构造函数中编写如下代码:

        m_qudpSocket->bind(QHostAddress::AnyIPv4,3956,QUdpSocket::ShareAddress);//绑定所有ip来接收组播组信息
        m_qudpSocket->joinMulticastGroup(QHostAddress("224.0.0.10"));//加入组播组ip:224.0.0.10
        m_qudpSocket->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption,1024*1024*8);//设置缓冲区
    connect(m_qudpSocket,SIGNAL(readyRead()),this,SLOT(RecvData()));//连接接收信号槽
    

    其他代码同单播相同

    三、 广播,广播也只有ip地址和单播有区别
    在pushButtonBroadcast按钮添加clicked()信号槽,并在信号接收函数中添加如下代码:
    m_qudpSocket->writeDatagram(ui->textEditSendData->toPlainText().toUtf8(),QHostAddress::Broadcast,3956);

    展开全文
  • UDP组播服务器

    千次阅读 2018-08-19 18:27:29
    组播传输:数据发送者(源数据)将同一数据发送到多个接受者(组播组成员)。无论有多少个接受者,在整个网络链路上,只有一份该数据(在特殊场合,可以节省带宽,减少主干网络阻塞)。 组播报文的目的地址使用的是D类IP...
  • Qt网络UDP文件传输

    热门讨论 2011-11-10 00:57:23
    基于QTudp传输
  • Java UDP 组播实现

    千次阅读 2016-06-27 10:34:43
    UDP(User Datagram Protocol,用户数据报协议)是传输层的另一种协议,它比TCP具有更快的传输速度,但是不可靠。 UDP发送的数据单元称为UDP数据报,当网络传输UDP数据报时,无法保证数据报一定到达目的地,也无法保证...
  • UDP 组播---基本概念

    万次阅读 2017-06-09 18:24:32
       本文章已收录于: ...先来了解下UDP ...UDP 是UserDatagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open ... System Interconnection,开放式系统互联) 参考模型中一种无连接的传输
  • 局域网发现之UDP组播

    2018-10-09 15:26:50
    局域网发现设备是通信的第一步,通信需要先知道对方的ip地址,因为一般使用 DHCP 动态分配 ip 地址的局域网内,各个主机的 IP 地址是由 DHCP 服务器...查询资料之后,发现使用udp单播、组播、广播来实现的方式都有,...
  • Java实现UDP组播(支持跨网段)

    千次阅读 2019-07-18 17:31:57
    package com.udp.test; import sun.security.util.BitArray; import javax.xml.bind.DatatypeConverter; import java.io.IOException; import java.net.DatagramPacket; import java.net.InetAddress;...
  • 关于UDP 中的组播问题

    千次阅读 2014-03-11 15:34:33
    根据查询的资料来看,UDP广播只能在内网(同一网段)有效,而组播可以较好实现跨网段群发数据。 ... IP网络传输方式共分为单播,组播(多播),广播三种。...而组播是一对多的传输方式,其中有个组播组
  • udp组播demo

    2020-07-16 17:14:40
    udp组播 组播报文的目的地址使用D类IP地址, D类地址不能出现在IP报文的源IP地址字段。单播数据传输过程中,一个数据包传输的路径是从源地址路由到目的地址,利用“逐跳”的原理[路由选择]在IP网络中传输。 然而在ip...
  • 对于UDP组播的一些认识

    千次阅读 2004-09-03 17:06:00
    对于UDP组播的一些认识 利用UDP组播能在intarnet,internet上也数据报的形式进行数据的组播(在internet上进行组播,要求路由器支持IGMP(internet网关管理协议,这个协议是在IP出现以后,为了支持组播而出现的))....
  • windows下UDP组播

    千次阅读 2018-08-12 18:19:57
    最近研究下UDP组播,首先上网看看各种组播的含义,以下是总结的:  多播,也称为“组播”,将网络中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此...
  • 本软件具有MD5校验和,基于UDP协议编写了多的服务器与客户端,可以传输文件,同时具有重传机制。
  • UDP组播

    千次阅读 2011-04-25 16:48:00
    组播技术可形象的描述如下:  ...这种多点通信方式为组内广播,即组播技术,也称多播技术,多目网关技术。 TCP/IP传送方式  组播技术是TCP/IP传送方式的一种。在我们讨论组播技术之前先来看看TCP/
  • UDP组播调试(使用TCP&UDP调试工具)

    万次阅读 2018-12-09 22:29:32
    如何使用调试工具进行UDP组播调试 一、下载UDP&amp;TCP调试工具 二、双击打开调试工具并建立端口 2.1 创建组播客户端1  类型:UDP(组播模式);目标IP:225.0.0.20;端口:60000;本机端口制定:60002  ...
  • QT UDP组播的简单实现

    千次阅读 2018-10-16 16:22:37
    组播的概念:(Multicast)在发送者和每一接收者之间实现点对多点网络连接。如果一台发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包。它提高了数据传送效率。减少了骨干网络出现拥塞的可能性...
  • QT使用UDP方式传输文件的关键代码

    万次阅读 热门讨论 2013-10-31 11:14:08
    QT中使用UDP传输的核心代码: void Sender::sendData() { if (!file.atEnd()) { QByteArray line = file.read(8000); udpSocket->writeDatagram( line , QHostAddress("192.168.0.175"),7755); i++; qDebug() !
  • 局域网发现设备代码实现:udp组播

    万次阅读 2017-02-20 15:57:12
    package com.example.amyli.my.client; import com.example.amyli.my.base.DeviceData; import com.example.amyli.my.base.RequestSearchData; import com.example.amyli.my.base.SearchConst; ...
  • UDP 组播 广播

    2019-06-12 13:33:27
    为什么80%的码农都做不了架构师?>>> ...
  • LWIP下UDP组播协议——zynq使用

    千次阅读 2018-02-07 22:22:43
    平台:zynq zc702 LWIP : 1.4.1是否有系统: 否一、udp基础知识:每一个UDP连接都对应一个UDP控制块,UDP协议的实现就是对这些控制块结构成员进行操作。为什么需要控制块链表?为了让协议栈可以实现多个连接,可以...
  • LWIP Sokect UDP组播

    2020-04-24 21:04:46
    1 Socket编程-udp服务端和客户端通信 (1).建立一个套接字(Socket) (2).绑定服务器端IP地址及端口号-... (3).... (需提供主机IP地址及端口) ...(4)....2 UDP信息传递的方式分三类 ① 单Unicast:是客户端与服务器之间的点...

空空如也

1 2 3 4 5 ... 20
收藏数 31,414
精华内容 12,565
关键字:

udp组播方式传输要求