使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。
单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是多播的用途。
通常我们讨论的udp的程序都是一对一的单播程序。本章将讨论一对多的服务:广播(broadcast)、多播(multicast)。对于广播,网络中的所有主机都会接收一份数据副本。对于多播,消息只是发送到一个多播地址,网络知识将数据分发给哪些表示想要接收发送到该多播地址的数据的主机。总得来说,只有UDP套接字允许广播或多播。
一、UDP广播
广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。这也是为什么IP协议的设计者故意没有定义互联网范围的广播机制。
广播地址通常用于在网络游戏中处于同一本地网络的玩家之间交流状态信息等。
其实广播顾名思义,就是想局域网内所有的人说话,但是广播还是要指明接收者的端口号的,因为不可能接受者的所有端口都来收听广播。
UDP服务端代码:
1 #include<iostream> 2 #include<stdio.h> 3 #include<sys/socket.h> 4 #include<unistd.h> 5 #include<sys/types.h> 6 #include<netdb.h> 7 #include<netinet/in.h> 8 #include<arpa/inet.h> 9 #include<string.h> 10 using namespace std; 11 int main() 12 { 13 setvbuf(stdout,NULL,_IONBF,0); 14 fflush(stdout); 15 int sock=-1; 16 if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1) 17 { 18 cout<<"sock error"<<endl; 19 return -1; 20 } 21 const int opt=-1; 22 int nb=0; 23 nb=setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char*)&opt,sizeof(opt));//设置套接字类型 24 if(nb==-1) 25 { 26 cout<<"set socket error...\n"<<endl; 27 return -1; 28 } 29 struct sockaddr_in addrto; 30 bzero(&addrto,sizeof(struct sockaddr_in)); 31 addrto.sin_family=AF_INET; 32 addrto.sin_addr.s_addr=htonl(INADDR_BROADCAST);//套接字地址为广播地址 33 addrto.sin_port=htons(6000);//套接字广播端口号为6000 34 int nlen=sizeof(addrto); 35 while(1) 36 { 37 sleep(1); 38 char msg[]={"the message broadcast"}; 39 int ret=sendto(sock,msg,strlen(msg),0,(sockaddr*)&addrto,nlen);//向广播地址发布消息 40 if(ret<0) 41 { 42 cout<<"send error...\n"<<endl; 43 return -1; 44 } 45 else 46 { 47 printf("ok\n"); 48 } 49 } 50 return 0; 51 }
UDP广播客户端代码: