UDP 收/发 广播包

网络通信基础

如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要知道程序可监听的端口。因为同一主机上的程序使用网络是通过端口号来区分的。

UDP Socket的使用过程:

1. 初始化网络库

2. 创建SOCK_DGRAM类型的Socket。

3. 绑定套接字。

4. 发送、接收数据。

5. 销毁套接字。

6. 释放网络库。

广播数据包的原理:

专门用于同时向网络中所有工作站进行发送的一个地址叫做广播地址。在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的IP 地址为广播地址。如果你的IP为:192.168.1.39,子网掩码为:255.255.255.0,则广播地址为:192.168.1.255;如果IP为192.168.1.39,子网掩码为:255.255.255.192,则广播地址为:192.168.1.63。

如果只想在本网络内广播数据,只要向广播地址发送数据包即可,这种数据包可以被路由,它会经由路由器到达本网段内的所有主机,此种广播也叫直接广播;如果想在整个网络中广播数据,要向255.255.255.255发送数据包,这种数据包不会被路由,它只能到达本物理网络中的所有主机,此种广播叫有限广播。

使用UDP协议发送、接收广播包的过程。

假如我们要向192.168.0.X,子网掩码为:255.255.255.0的子网中发送广播包。

其步骤如下:

1. 初始化Winsock库。

2. 创建SOCK_DIRAM类型的Socket。

3. 设置Socket的属性允许其广播。

4. 发送数据包到192.168.0.255

5. 接收自己广播的广播包。

6. 关闭Socket

7. 释放网络库。

注意事项如下:

1. 接收方一定要知道广播方的口号,然后绑定此端口号才能正确接收。

2. 接收方的Socket不需要设置成广播属性。

3. 绑定的IP不可以使用“127.0.0.1”,可以使用真实IP地址或者INADDR_ANY。否则接收失败。

 

参考代码:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
//*-----------变量,数据类型宏定义-------------------
#define PORT 3387
#define MAX 255

int main(void)
{
int sockfd, ret;
int size, len;
int so_broadcast=1;
struct sockaddr_in my_con;
struct sockaddr_in cl_con;
char snd[MAX] = "123456789";
char rec[MAX];
//创建socket
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0)
{
perror("socket error!\n");
exit(1);
}
//创建套接口
my_con.sin_family = AF_INET;
my_con.sin_port = ntohs(PORT);
my_con.sin_addr.s_addr = inet_addr("192.168.1.255");
len = sizeof(struct sockaddr);
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&so_broadcast,sizeof(so_broadcast));
//绑定套接口
if(bind(sockfd, (struct sockaddr *) &my_con, len) < 0)
{
perror("bind error!\n");
exit(1);
}
//数据传输处理
ret = sendto(sockfd, snd, strlen(snd), 0, (struct sockaddr *) &my_con, len);
if(ret < 0)
{
perror("send error!\n");
exit(1);
}
printf("发送广播数据:%s\n",snd);
size=sizeof(cl_con);
ret = recvfrom(sockfd,rec,MAX,0,(struct sockaddr *)&cl_con,&size);
rec[ret] = '\0';
printf("接收广播数据:%s\n",rec);
close(sockfd);
return 0;
}

时间: 2024-08-02 14:04:52

UDP 收/发 广播包的相关文章

UdpClient无法在局域网中发送UDP广播包的解决办法

问题描述: 在XP或者Win7上面没有办法发送UDP广播报,发送的代码如下所示,应该没有问题. 1 /// <summary> 2 /// 发送消息 3 /// </summary> 4 /// <param name="strDataToSend">要发送的字符串</param> 5 /// <returns>发送成功与否的标识</returns> 6 public bool SendMsg(string str

咨询UDP发送广播包的问题

问题描述 用UDP发送广播包,请问有什么代码例程?求学习谢谢. 解决方案 解决方案二:百度一大把

mina udp 广播-Android Mina框架是否支持UDPClient发送广播包?

问题描述 Android Mina框架是否支持UDPClient发送广播包? 如题,请问mina框架是否支持发送udp广播包,以下面代码发送,会提示服务器异常. // 创建一个tcp/ip 连接 //创建客户端连接器 Log.i("TAG","正在创建Socket连接!"); Log.i("TAG","PORT:"+PORT+",HostName:"+hostName); NioDatagramConnec

vc++2010用udp收double

问题描述 vc++2010用udp收double udp收double数如何解包,1个double收到8个字节的内存数-有没有什么可以用的函数 解决方案 可以直接memcpy复制到一个double数据变量 解决方案二: 直接强制类型转换就可以了double * d = (double *)&data[0]; //收到的数据不过要区分大端序和小端序,如果对方机器也是PC,不用考虑.

udp-UDP绑定本地端口和IP,用sendto向指定端口发广播数据失败

问题描述 UDP绑定本地端口和IP,用sendto向指定端口发广播数据失败 MFC下,上位机采用UDP协议,绑定本地端口60000,向目标端口50000发送广播数据,然后单片机应答.但是上位机调用sendto函数发送失败! 解决方案 代码如下: int ret = -1; CString str; char buf[10] = {0,1,2,3,4,5,6,7,8,9}; /* 加载套接字库 */ if (!AfxSocketInit()) MessageBox("加载套接字库失败!"

推荐一些socket工具,TCP、UDP调试、抓包工具 推荐一些socket工具,TCP、UDP调试、抓包工具

还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用.好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控. 假如有一天,你写"传统"的PHP有些累了,想玩玩socket了,搞搞python.NodeJS.GO之类的新兴语言或框架(当然我不是说这些语言不能写web),或者干脆就用PHP吧,事实上PHP5.4的性能提高的真是相当之多,用PHP 的socket函数就能简单的写一个web socket服务器 

winsock 收发广播包

广播包的概念 广播包通常为了如下两个原因使用:1 一个应用程序希望在本地网络中找到一个资源,而应用程序对于该资源的地址又没有任何先验的知识. 2 一些重要的功能,例如路由要求把它们的信息发送给所有找到的邻机.被广播信息的目的地址取决于这一信息将在何种网络上广播.Internet域中支持一个速记地址用于广播-INADDR_BROADCAST.由于使用广播以前必须捆绑一个数据报套接口,所以所有收到的广播消息都带有发送者的地址和端口. 广播通信是无连接的通信,通信前不需要建立连接.不需要listen和

搜狗输入法怎么发表情包

  搜狗输入法怎么发表情包: 刚才更新了下手机搜狗输入法,我打个"大哭",不用去调相册,也不用去搜索图片,直接点那个四叶草按钮,各种哭的表情包就出来了!

premission deny-snmp想在一个网段发广播

问题描述 snmp想在一个网段发广播 在linux上安装完snmp后,比如对发送一个命令snmpget -v 2c -c public 192.168.159.1 1.3.6.1.2.1.1.1.0的时候就有正确返回,但是我想在这个子网段192.168.159/24获取所有ip地址他的信息,想发个广播,把上面ip地址改为192.168.159.255,然后就出现snmpget:failure to sendto(premission deny) 我刚刚接触这个,不是很懂,希望了解的朋友能够给点解