首页 > 技术文章 > 广播实现

defen 2016-03-17 15:34 原文

广播范例:

谁先接受绑定谁。Udp传输都遵循这个规则。

广播步骤:

接受:

1、 创建用户数据包套接字socket()

2、 绑定本地ip地址和端口bind()

3、 接受数据recvfrom()

4、 关闭socketfd(close())

发送:

1、 创建用户数据报套接字socket()

2、 打开广播功能setsockopt();

Int on=1

Setsockopt(socketfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(int));

3、 初始化接受方地址(指定该地址为组播地址192.168.1.255struct sockaddr_in

4、 发送数据sendto()倒数第二个参数为第二步指定的ipport

关闭套接字socket();

代码范例:
客户端(接受数据)
#include<stdio.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include<pthread.h>
#include<strings.h>
int main()
{    int socketfd = socket(AF_INET,SOCK_DGRAM,0);//、、、、、1.创建udp套接字 得到socketfd
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(6000);
    saddr.sin_addr.s_addr = htonl(INADDR_ANY);
    int s = sizeof(struct sockaddr_in);    
    bind(socketfd,(struct sockaddr *)&saddr,s);//、、、、、、、2、绑定本机ip和port;bind()
    struct sockaddr_in caddr;
    char buf1[20];
    int n;
    n = recvfrom(socketfd,buf1,20,0,(struct sockaddr *)&caddr,&s);//、、、、3、接受数据recvfrom()….caddr自动填写的。
        buf1[n] = '\0';
        printf("%s\n",buf1);
        
    close(socketfd);//、、、、、、、、、、、、、、、、、4、关闭套接字
}

服务器(发送数据)
#include<stdio.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include<pthread.h>
#include<strings.h>

int main()
{    int socketfd = socket(AF_INET,SOCK_DGRAM,0);//、、、、、1.创建套接字socket
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(6000);
    saddr.sin_addr.s_addr = inet_addr("192.168.193.255");
/*
    int on = 1;
    setsockopt(socketfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));//、、、、、2、打开广播功能
    int s = sizeof(struct sockaddr);    
    char *buf = "hello\0";
    
    sendto(socketfd,buf,strlen(buf),0,(struct sockaddr *)&saddr,s);//3、发送数据saddr为广播地址。
    close(socketfd);
}

 

推荐阅读