首页 Linux socket编程探讨二(使用不同收发端口发送UDP广播)

Linux socket编程探讨二(使用不同收发端口发送UDP广播)

举报
开通vip

Linux socket编程探讨二(使用不同收发端口发送UDP广播)Linux socket编程探讨二(使用不同收发端口发送UDP广播) Linux socket编程探讨二(使用不同收发端口发送UDP广播) 本文通过比较单播、多播、广播方式传送消息的不同,介绍了广播地址、任意端口等概念,进而通过实例介绍一种了使用不同收发端口发送UDP广播的方法,即发送端使用系统动态分配的端口,接收端使用指定端口,使用这种方法可以让在同一主机或者同一进程的收发端的请求和响应互不干扰。 1. 引言 在网络编程中,有时遇到这样的情形:需要向整个网络(或者局域网)内的主机发送询问消息 并等待回应,如...

Linux socket编程探讨二(使用不同收发端口发送UDP广播)
Linux socket编程探讨二(使用不同收发端口发送UDP广播) Linux socket编程探讨二(使用不同收发端口发送UDP广播) 本文通过比较单播、多播、广播方式传送消息的不同,介绍了广播地址、任意端口等概念,进而通过实例介绍一种了使用不同收发端口发送UDP广播的方法,即发送端使用系统动态分配的端口,接收端使用指定端口,使用这种方法可以让在同一主机或者同一进程的收发端的请求和响应互不干扰。 1. 引言 在网络编程中,有时遇到这样的情形:需要向整个网络(或者局域网)内的主机发送询问消息 并等待回应,如果挨个询问每个主机的话效率太低,我们常采用“广播”的方式发送消息和接收回 应。和TCP相比,UDP是无连接的、不可靠的数据包 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 ,但是如上提到的“广播消息”,由于 TCP是有连接的而必须用到UDP。 实际上发送广播时时常遇到如此情形:发送广播的服务端同时也是客户端,也就是说既需要发 送广播接收回应,又需要等待接收其他客户端的请求并返回回应。如何区分接收到的回应和请求, 本文提供了一种解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 。 2. 步骤与实例 2.1 基本概念 Socket网络编程中消息的传送方式分为3种: 单播:信息的接收和传递只在两个节点之间进行,相当于“一对一”; 多播:消息在发送者和加入了多播组的多个主机之间进行,相当于“一对多”; 广播:消息在发送者和广播地址包含的所有主机进行,相当于“一对所有”。 TCP socket相当于单播;广播和多播仅应用于UDP socket,它们对需将报文同时传往多个接收者的应用来说十分重要。广播消息的目的IP地址是一种特殊IP地址,称为广播地址。广播地址由IP地址网络前缀加上全1主机后缀组成,如:192.168.1.255是192.169.1.0这个网络的广播地址;10.16.18.255是10.16.18.0这个网络的广播地址。向全部为1的IP地址(255.255.255.255)发送消息的话,那么理论上全世界所有的联网的计算机都能收得到了。但实际上不是这样的,一般路由器上设置抛弃这样的包,只在本地网内广播,所以效果和向本地网的广播地址发送消息是一样的。 在linux的include/inet.h头文件中,对一些特殊的地址进行了宏定义: — 1 — # define INADDR_ANY ((unsigned long int) 0x00000000) # define INADDR_LOOPBACK ((unsigned long int) 0x7f000001) # define INADDR_BROADCAST ((unsigned long int) 0xffffffff) # define INPORT_ANY 0 其中,INADDR_ANY表示任意地址,包含所有网卡的所有IP地址; INADDR_LOOPBACK表示回环IP 127.0.0.1; INADDR_BROADCAST表示广播地址/255.255.255.2555 INPORT_ANY这个参数表示任意端口,具体作用请参考以下说明: Port 0 Port 0 is officially a reserved port in TCP/IP networking, meaning that it should not be used for any TCP or UDP network communications. However, port 0 sometimes takes on a special meaning in network programming, particularly Unix socket programming. In this environment, port 0 is a programming technique for specifying system-allocated (dynamic) ports. Instead of "hard-coding" a particular port number, or writing code that searches for an open port, Unix programmers simply specify port 0 as a connection parameter. That triggers the operating system to automatically search for and return the next available port in the dynamic port number range. This programming technique does not work the same way in Microsoft Windows as it does in Unix. 其大意是,端口0是系统保留的端口,用于TCP 和UDP网络编程,对于UNIX os,系统会自动分 配一个可使用的动态端口用于socket连接。 这个端口对于我们UDP广播非常有用,我们可以将发送端bind到一个port 0(假如动态分配了 PORT1),然后往指定的BROARDCAST_PORT发送消息,接收端bind BROARDCAST_PORT等待消息, 然后往PORT1返回响应;这样发送端和接收端使用不同端口收发消息,即使发送端和请求段在主机的 不同进程,或者同一个进程的不同线程,亦可将接收的请求和响应简单分离开来。 2.2 步骤 发送端: 1. 创建udp socket:clientSockfd; 2. 设置clientSockfd属性为SO_BROADCAST; — 2 — 3. 将clientSockfd bind到某个地址(任意地址亦可)和端口0; 4. 发送消息到广播地址的BROARDCAST_PORT; 5. 接收回应,回应一般有多个,需要设定超时时间或者回应个数。 接收端: 1. 创建udp socket serverSockfd; 2. 将serverSockfd绑定到本机的某个地址(任意地址亦可)和指定的广播端口BROARDCAST_PORT; 3. 等待接收请求,并向发送请求的clientSockfd返回响应。 2.3 实例 客户端: #include #include #include #include #include #include #include #include #include #define AMS_UDP_PORT 1122 //UDP port #define MAX_SOCK_SIZE 1024 //input:server ip,e.g.:Broadcast ip:255.255.255.255 int main(int argc,char* argv[]) { int sockfd; struct sockaddr_in their_addr,saUdpCli; struct in_addr addr; int broadcast = 1; int num = 0; if(argc != 2) { fprintf(stderr,"Usage: ipaddress\n"); exit(1); } if((sockfd = socket(AF_INET,SOCK_DGRAM,0)) == -1) { perror("socket function!\n"); exit(1); — 3 — } if((setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&broadcast,sizeof(broadcast))) == -1) { perror("setsockopt function!\n"); goto EXIT; } saUdpCli.sin_family = AF_INET; saUdpCli.sin_addr.s_addr = inet_addr("127.0.0.1");//loop-back ip saUdpCli.sin_port = htons (0); int err = bind (sockfd, (struct sockaddr *) &saUdpCli, sizeof (saUdpCli)); if(err < 0) { perror("bind:"); goto EXIT; } inet_pton(AF_INET, argv[1], &addr.s_addr); their_addr.sin_family = AF_INET; their_addr.sin_port = htons(AMS_UDP_PORT); their_addr.sin_addr = addr; char * buffer = "Client:broadcast test!"; if( (num = sendto( sockfd,(const void *)&buffer,sizeof(buffer),0,(struct sockaddr *)&their_addr,sizeof(struct sockaddr) )) < 0) { perror("sendto :\n"); goto EXIT; } char recvline[MAX_SOCK_SIZE + 1]; int i = 0; for(;i<10;i++) { int n = recvfrom(sockfd, recvline, MAX_SOCK_SIZE, 0, NULL, NULL); if(n <= 0) { //TBD:error process } recvline[n] = 0; printf("Received:%s \r\n", recvline); } EXIT: close(sockfd); — 4 — return 0; } 服务端: #include #include #include #include #include #include #include #include #include #define MAX_SOCK_SIZE 1024 #define AMS_UDP_PORT 1122 //UDP port int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr; if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)// { perror("socket"); exit(1); } bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(AMS_UDP_PORT); printf(" addr:%s\r\n",inet_ntoa(servaddr.sin_addr)); if(bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) { perror("bind"); goto EXIT; } int n; u8 msg[MAX_SOCK_SIZE]; struct sockaddr_in pcliaddr; for ( ; ; ) { if((n = recvfrom(sockfd, msg, MAX_SOCK_SIZE, 0, (struct sockaddr *)&pcliaddr, &sizeof(pcliaddr))) <0) { — 5 — //TBD:error process } else { printf("recv %d bytes,msg: %s\r\n",n,msg); } sendto(sockfd, msg, n, 0, (struct sockaddr *)&pcliaddr, len); } EXIT: close(sockfd); exit(1); } 3. 结论 TCP socket适用于单播方式;UDP socket单播、多播、广播都适用;使用UDP socket收发广播时,广播地址和端口是需要认真考虑的两个参数;将发送端使用系统自动分配的端口(INPORT_ANY),接收端使用指定端口,可以让同一主机或者同一进程的收发两方的请求和响应互不干扰。 本文结论仅在Linux 系统上测试过。 参考资料 1. UNIX? Network Programming Volume 1, Third Edition: The Sockets Networking API 2. Linux OS manpage — 6 —
本文档为【Linux socket编程探讨二(使用不同收发端口发送UDP广播)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_554469
暂无简介~
格式:doc
大小:26KB
软件:Word
页数:10
分类:互联网
上传时间:2018-01-18
浏览量:59