sock使用UDP协议进行广播发送数据

本文介绍了一个简单的UDP广播程序实现过程,包括服务器端和客户端的代码示例。通过使用socket编程和setsockopt函数设置SO_BROADCAST选项,实现了在局域网内的广播功能。

使用ifconfig命令查看自己的广播地址:

wlp3s0b1  Link encap:以太网  硬件地址  
          inet 地址:192.168.1.102  广播:192.168.1.255  掩码:255.255.255.0
         
         

可以看到主机的广播地址是192.168.1.255

编写UDP服务器程序:

#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <arpa/inet.h>

int sockfd;

void sig_handler(int signo);

int main(int argc, char * argv[])
{
    if(argc < 2)
    {
        printf("usage: %s port\n", argv[0]);
        exit(1);
    }
    if(signal(SIGINT, sig_handler) == SIG_ERR)    //开始捕获信号 SIGINT 
    {
        perror("signal sigint error!");
        exit(1);
    }
    /*步骤1: 创建socket*/
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0)
    {
        perror("socket error!");
        exit(1);
    }
  
    /*步骤2: 调用bind函数对socket和地址进行绑定*/
    struct sockaddr_in serveraddr;
    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[1])); //port
    serveraddr.sin_addr.s_addr = INADDR_ANY;  //ip匹配所有的ip
    if(bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
    {
        perror("bind error!");
        exit(1);
    }
 
    struct sockaddr_in clientaddr;
    socklen_t len = sizeof(clientaddr);
    char buffer[1024];
    while(1)
    {
        memset(buffer, 0, sizeof(buffer));
        memset(&clientaddr, 0, sizeof(clientaddr));

        if(recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&clientaddr, &len) < 0)
        {
            perror("recvfrom error!");
            exit(1);
        }
        else
        {
            char ip[16];
            inet_ntop(AF_INET, &clientaddr.sin_addr.s_addr, ip, sizeof(ip));
            int port = ntohs(clientaddr.sin_port);
            printf("%s(%d): %s\n", ip, port, buffer);
        }

        
    }    






}



void sig_handler(int signo)
{
    if(signo == SIGINT)
    {
        printf("receiver clolse!\n");;
        close(sockfd);
        exit(1);
    }
}













编写UDP广播程序:

#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <arpa/inet.h>

int sockfd;

void sig_handler(int signo);

int main(int argc, char * argv[])
{
    if(argc < 3)
    {
        printf("usage: %s port\n", argv[0]);
        exit(1);
    }
    if(signal(SIGINT, sig_handler) == SIG_ERR)    //开始捕获信号 SIGINT 
    {
        perror("signal sigint error!");
        exit(1);
    }
    /*步骤1: 创建socket*/
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0)
    {
        perror("socket error!");
        exit(1);
    }
    int opt = 1;
    
    setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));


    /*步骤2: 调用bind函数对socket和地址进行绑定*/
    struct sockaddr_in serveraddr;
    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[2])); //port
    inet_ntop(AF_INET,  (struct sockaddr*)&serveraddr.sin_addr.s_addr,argv[1], sizeof(argv[1]));
    printf("I will broadcast...\n");

    char *info = "hello Andrew";

    size_t size = strlen(info) * sizeof(char);
    if(sendto(sockfd, info, size, 0, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
    {
        perror("sendto error!");
        exit(1);
    }
    else
    {
        printf("broadcastn success!\n");
    }


}



void sig_handler(int signo)
{
    if(signo == SIGINT)
    {
        printf("receiver clolse!\n");;
        close(sockfd);
        exit(1);
    }
}













测试:

运行服务器:

andrew@andrew-Thurley:~/work/network$ bin/receiver 8888
127.0.0.1(35423): hello Andrew
127.0.0.1(43304): hello Andrew
127.0.0.1(58134): hello Andrew
127.0.0.1(53262): hello Andrew
127.0.0.1(35285): hello Andrew
127.0.0.1(58630): hello Andrew
127.0.0.1(41278): hello Andrew
127.0.0.1(39032): hello Andrew
127.0.0.1(55642): hello Andrew
127.0.0.1(44132): hello Andrew
127.0.0.1(35112): hello Andrew

运行客户端:

andrew@andrew-Thurley:~/work/network$ bin/broadcast 192.168.1.255
usage: bin/broadcast port
andrew@andrew-Thurley:~/work/network$ bin/broadcast 192.168.1.255 8888
I will broadcast...
broadcastn success!
andrew@andrew-Thurley:~/work/network$ bin/broadcast 192.168.1.255 8888
I will broadcast...
broadcastn success!
andrew@andrew-Thurley:~/work/network$ bin/broadcast 192.168.1.255 8888

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

andrewbytecoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值