UDP的使用

UDP客户端与服务器是无连接的,它没有TCP各种各样的算法保证数据的完整性,因此较之TCP,UDP在传输数据时少了很多开销,所以在网络信道好的情况下,它传输的效率还是挺高的。基于这个特性,很多实时视频会议系统都是使用UDP协议,因为对实时视频来说,它要求更高的实时性,丢一两个数据包反而不太重要。

UDP有三种通讯方式,单播广播以及组播:

单播

服务端要经历创建UDP套接字、绑定单播地址等操作,而客户端在创建UDP套接字后,可直接调用sendto()函数向服务器绑定的地址发送数据,服务器通过recvfrom()获取到客户端发送的数据以及地址,因为客户端只会发送一次数据,所以服务器调用recvfrom()得尽可能的快,反之,服务器也可以使用刚刚获取的客户端地址以及sendto()向客户端回复数据,客户端接收流程与服务器一样。

广播

UDP广播时会向局域网的每一个主机发送数据报,但数据报扩散范围仅限局域网,网关不会向广域网继续转发,否则会造成网络拥塞。主机广播时只需在创建UDP套接字后绑定广播地址255.255.255.255:port,即可向局域网广播数据,而客户端可从127.0.0.1:port上接收广播数据。

组播

组播类似广播,但数据只在小范围传播,不像广播那样把数据发给每一个主机,传播范围通过组播地址来约定,组播的地址范围是224.0.0.0到239.255.255.255,主机只要加入某个组播地址即可从此地址中获取到组播成员发送的数据。

structip_mreq myMreq;

bo_int32_tret = -1;

SOCKETskt = b_create_socket( AF_INET,SOCK_DGRAM,IPPROTO_UDP );

bo_uint32_tip = inet_addr("172.16.36.245"),rip;

bo_uint16_tport = htons(1234),rport;

printf("skt:%drskt:%d\n",skt,rskt);

ret= b_bind_socket( skt,0,port );

printf("bind:%d\n",ret );

myMreq.imr_multiaddr.s_addr

= inet_addr("230.1.1.1"); //加入的组

myMreq.imr_interface.s_addr

= ip; //把本机加入到这个组

//IPPROTO_IP

//SOL_IP

ret= b_setsocket_opt(skt,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void*)&myMreq,sizeof(myMreq) );

printf("b_setsocket_opt:%d\n",ret );

while(1)

{

ret =b_recv_from( skt,recv_buf,sizeof(recv_buf),&rip,&rport );

if( ret > 0 )

printf( "recv ip:%d port:%dbuf:%s\n",rip,rport,recv_buf );

}

以上是加入组播,以及获取组播数据的示例代码,可以看出,程序是通过设置套接字属性加入组播组的,特别一提的是,在把本机地址加入组播时,本机地址不能填127.0.0.1,它不像广播时那样绑定本地回环地址也能收到广播数据。

你可能感兴趣的:(UDP的使用)