欢迎亚博app买球官方网站!我们只为解决化工装备的难题!提供化工装备一站式的整体解决方案!

亚博app买球-亚博app英超买球首选

亚博app买球

石化装备制造行业系统方案提供商

专注压力容器生产、研发、制造具有一、二、三类压力容器制造许可证

全国咨询热线 0510-80751588

当前位置: 首页 > 公司动态 > 行业百科

UDP广播,组播和点播

作者:亚博app买球    发布日期:2021-03-31 13:18:20

1:说明

在使用UDP协议进行信息传输之前,无需建立连接。换句话说沙巴app备用网址 ,客户端将信息发送到服务器。客户端只需要提供服务器的ip地址和端口号亚博yabovip2020进入 ,然后将信息封装到要发送和发送的消息中即可。至于服务器是否存在或是否可以接收消息,客户端根本不需要关心。

单播用于两个主机之间的端到端通信,广播用于从一个主机到整个LAN上的所有主机的数据通信。单播和广播是两个极端,要么与一台主机通信,要么与整个LAN上的主机通信。实际上,通常有必要与一组特定的主机进行通信,而不是与整个LAN上的所有主机进行通信。这就是多播的目的。

通常,我们讨论的udp程序是一对一的单播程序。本文将讨论一对多服务:广播和多播。为了进行广播,网络中的所有主机都将收到数据的副本。对于多播,仅将消息发送到多播地址,并且网络仅将数据分发到表明它们希望接收发送到多播地址的数据的那些主机。通常,只有UDP套接字才允许广播或多播。

广播UDP和单播UDP之间的区别是IP地址。广播使用广播地址25 5. 25 5. 25 5. 255将消息发送到同一广播网络上的每个主机。值得强调的是udp 广播,路由器不会转发本地广播信息。当然,这很容易理解,因为如果路由器转发广播信息亚博网站有保障的 ,将不可避免地导致网络瘫痪。这就是为什么IP协议的设计者故意没有定义Internet范围的广播机制的原因。

实际上,顾名思义,广播就是与局域网中的所有人通话,但是广播仍然需要指定接收器的端口号,因为不可能在接收器的所有端口上收听广播

多播,也称为“多播”,在逻辑上将网络中相同服务类型的主机进行分组。发送和接收数据时,数据仅在同一组中进行udp 广播,其他主机无法加入该组。发送和接收相应的数据。

在WAN上广播时,其中的交换机和路由器仅将数据复制并转发到需要获取数据的主机。主机可以请求路由器加入或离开组。网络中的路由器和交换机有选择地复制和传输数据,并且仅将数据传输到组中的主机。组播功能可以一次将数据发送到多个主机,而不会影响不需要的其他主机(未加入组)的其他通信。

广播,组播和一对一广播的服务代码都相同,客户端代码基本相同,但地址不同。

广播是:25 5. 25 5. 25 5. 255我发现只有网卡所在的网络

组播为:19 2. 16 8. 1. 255

一对一广播是:19 2. 16 8. 1. 101或其他特定地址。

2:服务器程序代码

#include "stdafx.h"
#include"winsock2.h"
#include
#include
using namespace std;
#define MYPORT 8080    // the port users will be connecting to
int main()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2), &wsaData);
    SOCKET sock;
    sock = socket(AF_INET,SOCK_DGRAM,0);
    char broadcast = '1';
//     This option is needed on the socket in order to be able to receive broadcast messages
//   If not set the receiver will not receive broadcast messages in the local network.
    if(setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&broadcast,sizeof(broadcast)) < 0)
    {
       cout<<"Error in setting Broadcast option";
        closesocket(sock);
        return 0;
    }
    struct sockaddr_in Recv_addr;  
    struct sockaddr_in Sender_addr;
    int len = sizeof(struct sockaddr_in);
    char recvbuff[50];
    int recvbufflen = 50;
    char sendMSG[]= "Broadcast message from READER";
    Recv_addr.sin_family       = AF_INET;        
    Recv_addr.sin_port         = htons(MYPORT);   
    Recv_addr.sin_addr.s_addr  = INADDR_ANY;
    if (bind(sock,(sockaddr*)&Recv_addr, sizeof (Recv_addr)) < 0)
    {
        cout<<"Error in BINDING"<

3:客户端代码为:

#include"winsock2.h"
#include
#include
using namespace std;
#define MYPORT 8080    // the port users will be connecting to
int main()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2), &wsaData);
    SOCKET sock;
    sock = socket(AF_INET,SOCK_DGRAM,0);
    char broadcast = '1';
    if(setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&broadcast,sizeof(broadcast)) < 0)
    {
        cout<<"Error in setting Broadcast option";
        closesocket(sock);
        return 0;
    }
    //这段代码设置广播方式,客户端是必要的,服务端可选。在linux 里, 应该是 int broadcast='1'
    struct sockaddr_in Recv_addr;  
    struct sockaddr_in Sender_addr;
    int len = sizeof(struct sockaddr_in);
    char sendMSG[] ="Broadcast message from SLAVE TAG";
    char recvbuff[50] = "";
    int recvbufflen = 50;
    Recv_addr.sin_family       = AF_INET;        
    Recv_addr.sin_port         = htons(MYPORT);   
	//  Recv_addr.sin_addr.s_addr  = INADDR_BROADCAST; // this isq equiv to 255.255.255.255
    Recv_addr.sin_addr.s_addr = inet_addr("192.168.1.255");    //组播
    //Recv_addr.sin_addr.s_addr = inet_addr("192.168.1.101");    //单播,一对一
	//Recv_addr.sin_addr.s_addr = inet_addr("255.255.255.255");    //广播
	unsigned long tm=1000;
	if(setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&tm,sizeof(tm))){ printf("sockopt err");}
    //这段代码设置socket 的超时,这里设置是1000 ms
    // linux 里设置不一样
	cout<<"\nsent...";
	
	sendto(sock,sendMSG,strlen(sendMSG)+1,0,(sockaddr *)&Recv_addr,sizeof(Recv_addr));
	//long tm0=GetTickCount();
	int flag;
	for(int i=0;i<5;i++)
	{
    flag=recvfrom(sock,recvbuff,recvbufflen,0,(sockaddr *)&Recv_addr,&len);
	if(flag<0)
		{
			break;    //超时就退出循环
		}
	char addr_buf[20];
	cout<<"\nnet addr=\n"<<(int)Recv_addr.sin_addr.S_un.S_un_b.s_b1<<"."<<(int)Recv_addr.sin_addr.S_un.S_un_b.s_b2<<".";
		cout<<(int)Recv_addr.sin_addr.S_un.S_un_b.s_b3<<"."<<(int)Recv_addr.sin_addr.S_un.S_un_b.s_b4;
	
    cout<<"\n\n\tReceived message from Reader is =>  "<

以上代码是在Visual Studio 2010 c ++上编译和测试的。

4:以下是实现接口

启用了三台服务器,机器执行上述服务器代码,其中一台在zynq 7000的petalinux上执行,一台在另一台主机的虚拟主机ubuntu16上执行。有关正在运行的代码,请参见我的其他博客文章。 linux下的udp通信是一对一的单播。

TEL:135-8501-5999 FAX:0510-85180729 EMAIL:wxdf888@163.com

亚博app买球-宜兴厂

(宜兴工厂地址:无锡•宜兴市周铁镇兴达路8号)

备案号:苏ICP备17065672号-5

Copyright © 2019-2020 亚博app买球 版权所有