1.UDP套接字编程
UDP传输层的一个协议 面向无连接 数据报的传输层协议
无连接 不可靠的一种协议
既然不可靠为什么要用UDP
1.实时应用
2.在网络环境比较好的时候 UDP的效率更高。
可以在应用层保证你的数据可靠
sendto
recvfrom 你要知道谁给你发了消息你才好回信
练习:
1.DNS Domain Name syatem域名解析系统
www.baidu.com -> server
server --> "10.10.1.1"
如果你没有保存百度的地址
server -》"unknow"
我们每个套接字有一些行为和属性可以设置
如 每个套接字在内核中 都会有两个缓冲
send buffer
racv buffer
这两个缓冲区的大小是多少?
能不能改变其大小
(2)套接字的选项
每个套接字在不同的协议层面上有着不同的行为属性
有两个函数用于获取或设置套接字的选项
NAME
getsockopt, setsockopt - get and set options on socketsSYNOPSIS
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>获取套接字的行为属性
int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);
sockfd :套接字的描述符
level :要获取那个选项的“级别”
查表
optname :要获取选项的名称(宏)
optval :指向一段空间 用于保存获取到的选项的值
optlen :指向空间的大小 返回值越界
返回值
成功返回0
失败返回-1 同时errno被设置
设置套接字的行为属性
int setsockopt(int sockfd, int level, int optname, const void *optval,
socklen_t optlen);
sockfd :套接字的描述符
level :要设置那个选项的“级别”
查表
optname :要设置选项的名称(宏)
optval :指向一段空间 指向设置选项的值
optlen :指向空间的大小 返回值越界
返回值
成功返回0
失败返回-1 同时errno被设置
3.广播域与组播(多播)
(1)广播 boardcast
a 只有传输层协议时UDP时,才支持广播
TCP是面向连接 广播是一对多
b.广播的地址
子网内的广播地址是主机号全为1
假设子网掩码 255.255.255.0
则广播地址 X.X.X.255
netmask 为 255.255.128.0
你的IP是192.168.31.3
子网内的广播地址是 192.168.127.255
netmask 为 255.255.192.0
你的IP 192.168.128.33
子网的广播地址是?192.168.191.255
netmask 为 255.255.224.0
你的IP为 192.168.160.9
子网的广播地址为 192.168.191.255
c.全网广播地址 255.255.255.255
没有实际意义=》网络风暴=》网络瘫痪
(2)广播编程思路
看图 (3)组播(多播)
1.多播只有传输层协议为UDP时候才可以
2.为什么需要多播?
如果所有人都使用广播 占用带宽 容易造成网络风暴
组播是一种折中的方案 只有加入了某个多播组的主机才能收到数据
3.多播的地址 ipv4 中D类地址
4.多播的编程思路
“加入多播组”
struct ip_mreq//为了可以移植性 定义成私有的类型(放到.c)
{
struct in_addr imr_multiaddr;//多播的地址(D类地址)
struct in_addr imr_intreface;//接口(网卡)IP地址
//多播数据实际走那个网卡
};struct ip_mreq mreq;
mreq.imr_multiaddr.addr = inet_addr("224.10.10.1");
//下面两行代码二选一
//mreq.imr_intreface.addr = honl(INADDR_ANY); //所有位全为0 让系统给你选网卡
//mreq.imr_intreface.addr =inet_addr("0.0.0.0");//所有位全为0 让系统给你选网卡
setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void*)&mreq, sizeof(mreq));
6.要在支持多播的机子设置好路由(虚拟机可以不用)
//收到224.0.0.0网段的多播数据 往eth0这个网卡上面发
route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
//添加默认网关
route add default gw 192.168.31.1 dev eth0