广播

前面介绍的数据包发送方式只有一个接收方,称为单播
如果同时发给局域网中的所有主机,称为广播
只有用户数据报(使用UDP)套接字才能广播

广播地址:以192.168.1.0网段为例,最大的主机地址 192.168.1.255代表该网段的广播地址
发到该地址的数据包被所有的主机接收
255.255.255.255在所有网段中都代表广播地址。

广播的发送步骤:

1.创建用户报套接字
2.缺省创建的套接字不允许广播数据包,需要设置属性:setsockopt可以设置套接字属性
3.接收放地址指定为广播地址
4.指定端口信息
5.发送数据包
广播发送实例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string.h>

int main(int argc, char **argv)
{
int sockfd, clientfd;
struct sockaddr_in servaddr, clientaddr;
char buf[1024];
socklen_t len;
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket");
exit(1);
}

printf("socket = %d\n", sockfd);

memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8888);
servaddr.sin_addr.s_addr = inet_addr(argv[1]);


int on = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));

len = sizeof(clientaddr);
while(1)
{
fgets(buf, sizeof(buf), stdin);
sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&servaddr, len);
}
}

 


广播接收步骤:
创建用户报套接字
绑定本机IP地址和端口(绑定的端口必须和发送方指定的端口相同)
等待接收数据

例子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <fcntl.h>
#include <dirent.h>
#include <bits/time.h>

#define BUFSIZE 1024


int main()
{
int sockfd, clientfd;
struct sockaddr_in servaddr, clientaddr;
char buf[1024];
socklen_t len;

if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket");
exit(1);
}

printf("socket = %d\n", sockfd);

memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8888);
//servaddr.sin_addr.s_addr = inet_addr("192.168.1.241");
servaddr.sin_addr.s_addr = INADDR_ANY;

if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
{
perror("bind");
exit(1);
}

while(1)
{
len = sizeof(clientaddr);
recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&clientaddr, &len);
printf("ip = %s, port = %d\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
printf("buf = %s\n", buf);
}

return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2012-07-06 20:31  孟浩依然  阅读(316)  评论(0编辑  收藏  举报