socket的局域网广播
来源:互联网 发布:淘宝微淘官网登陆首页 编辑:程序博客网 时间:2024/05/06 15:55
广播
1. TCP/IP协议栈中, 传输层只有UDP可以广播.
2. 只能对同一子网内部广播, 广播数据包不经过路由器.
3. UDP的广播地址为255.255.255.255
4. 在winsock实现中, 有一个选项对应是否允许广播.linux下必须调用setsockopt打开该选项.
5. 打开后, 用sendto向255.255.255.255发送的数据包全部广播.
很多局域网都定义了一个特殊的保留地址, 称为广播地址. 当信息头中目的地址域的内容为广播地址时, 该帧被局域网上所有计算机接收.
这个过程称为广播.合法的广播地址就是主机的网络地址加上最大的主机号。网络地址通过机器的ip地址与子网掩码按位与得出,我们
以ip地址为10.78.202.175 ,子网掩码为255.0.0.0。
好了,说白了向局域网发送广播,就是向ip地址为255.255.255.255的指定端口发送数据。当然,由于此ip的用户根本就不存在,那么,
你就只能选择使用UDP的方式发送数据。
同时,当你将一组数据发送到路由,它发现用户的ip是255.255.255.255。那么这时,它会立刻明白,好哇,原来你是想将数据发往整个
网路(这里包括外网和内网),它当然不会允许你这么干,但是又不能不发,于是他就将数据发往内网的每个用户。
发送者:
1.首先创建socket
cfd = socket(AF_INET,SOCK_DGRAM,0)2.UDP默认不支持广播,你需要打开
int n = 1; // 0表示关闭属性,非0表示打开属性setsockopt(cfd,SOL_SOCKET,SO_BROADCAST,&n,sizeof(n));3.设置你要讲数据发给谁
struct sockaddr_in si;si.sin_family = AF_INET;si.sin_port = htons(8000);si.sin_addr.s_addr = inet_addr("255.255.255.255");4.废话少说,发送数据吧
sendto(cfd,buffer,buffer_size,0,(struct sockaddr *)&si,sizeof(si));5.养成好习惯,最后被忘了关闭socket
close(cfd);
接受者:
1.打开socketint cfd = socket(AF_INET, SOCK_DGRAM, 0);
2.将你的socket与指定的端口绑定,用于接受数据,你懂得
struct sockaddr_in si;si.sin_family = AF_INET;si.sin_port = htons(8000);//这里的端口要与上面的端口保持一致,亲,你注意到了没?si.sin_addr.s_addr = INADDR_ANY; int ret = bind(cfd, (struct sockaddr *)&si, sizeof(si));3.好了,可以开始接受数据了
recv(cfd,buf,22,0);4.还是那句话,用完记得还
close(cfd);
源代码:
发送者:
#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <string.h>#include <netinet/in.h>int main(){int cfd = socket(AF_INET,SOCK_DGRAM,0);int n = 1; // 0表示关闭属性,非0表示打开属性setsockopt(cfd, SOL_SOCKET, SO_BROADCAST, &n, sizeof(n));//广播设置struct sockaddr_in si;si.sin_family = AF_INET;si.sin_port = htons(8000);si.sin_addr.s_addr = inet_addr("255.255.255.255"); //这是对局域网全网段char buf[22];while(1){bzero(buf,22);printf("Input:");scanf("%s",buf);sendto(cfd,buf,22,0,(struct sockaddr *)&si,sizeof(si));}close(cfd);return 0;}
接受者:
#include <stdio.h>#include <sys/types.h> /* See NOTES */#include <sys/socket.h>#include <string.h>#include <netinet/in.h>int main(){int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd < 0){perror("socket");return 0;}struct sockaddr_in si;int addrlen = sizeof(si);bzero(&si,addrlen);si.sin_family = AF_INET;si.sin_port = htons(8000);si.sin_addr.s_addr = INADDR_ANY; //绑定int ret = bind(cfd, (struct sockaddr *)&si, sizeof(si));if(ret == -1){perror("bind");return 0;} char buf[22];struct sockaddr_in si_recv;addrlen = sizeof(si_recv);bzero(&si_recv,addrlen);si_recv.sin_family = AF_INET;si_recv.sin_port = htons(8000);si_recv.sin_addr.s_addr = INADDR_ANY; while(1){bzero(buf,22);recvfrom(cfd, buf, 21, 0, (struct sockaddr*)&si_recv, &addrlen);printf("[%s(%d)]:%s\n",(char *)inet_ntoa(si_recv.sin_addr),si_recv.sin_port,buf);}close(cfd);return 0;}
0 0
- socket的局域网广播
- socket的局域网广播
- socket的局域网广播
- Delphi用Socket IP/UDP局域网广播
- 用Socket在局域网内进行广播
- 用Socket在局域网内进行广播
- linux c socket之局域网广播
- linux c socket之局域网广播
- android 通过局域网udp广播自动建立socket连接
- android 通过局域网udp广播自动建立socket连接
- android 通过局域网udp广播自动建立socket连接
- 如何使用Socket在局域网内进行广播
- Linux下使用RAW SOCKET原始套接字构造UDP原始数据帧广播到局域网,在局域网的另一台计算机上显示UDP发送的信息
- Linux下使用RAW SOCKET原始套接字构造UDP原始数据帧广播到局域网,在局域网的另一台计算机上显示UDP发送的信息
- 注意局域网环路引起的广播风暴
- UDP实现局域网内的广播
- udp广播局域网传送消息的实现
- 基于UDP广播的局域网聊天工具
- Android的权限机制总结
- main函数中argc的区别argv
- 3-4 计算长方形的周长和面积
- Redis 3.0集群搭建/设备/FAQ
- ftp 上传文件
- socket的局域网广播
- cf467C George and Job
- linux screen 命令详解
- 今天才知道的开源项目,真是落后
- I need book
- Ngui 五种点击事件实现方式及在3d场景中点透的情况
- nohub command & 和 nohub command 的区别
- 8大减少跳出率的问题
- 用javascript实现html页面之间的参数传递的四种方法