网络编程:完成广播代码

该博客展示了如何使用C语言实现UDP广播的发送和接收。在发送端,程序创建了一个套接字,并设置了允许广播的选项,然后通过`sendto`函数将数据发送到指定的广播地址。在接收端,程序创建了广播套接字,绑定了广播IP和端口,然后使用`recvfrom`函数接收广播数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

广播发送

**************************************************************************************************************

#include <stdio.h>
#include <sys/types.h>         
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>                          
#include <string.h>
#include <unistd.h>
//广播的端口号和主机IP
#define SIN_PORT 8888
#define SIN_IP   "192.168.31.255"
//客户端的端口号和主机IP
#define CIN_PORT 6666
#define CIN_IP   "192.168.31.162"
#define ERR_MSG(msg) do{\
    fprintf(stderr,"__%d__\n",__LINE__);\
    perror(msg);\
}while(0)

int main(int argc, const char *argv[])
{
    //1、创建套接字(服务器端)
    int sfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sfd<0)
    {
        ERR_MSG("socket");
        return -1;
    }
    //设置为允许广播
    int data =100;
    if(setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&data,sizeof(data))<0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }

    //服务器地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port  = htons(SIN_PORT);//端口号(主机端口号转为网络字节序)
    sin.sin_addr.s_addr  =inet_addr(SIN_IP);//服务器IP的网络字节序
    //客户端地址信息结构体
    struct sockaddr_in cin;
/*
    cin.sin_family = AF_INET;
    cin.sin_port  = htons(CIN_PORT);//端口号(客户端主机端口号转为网络字节序)
    cin.sin_addr.s_addr  =inet_addr(CIN_IP);//客户端IP的网络字节序

    //2、绑定客户端IP地址和端口号
    if(bind(sfd,(struct sockaddr *)&cin,sizeof(cin))<0)
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("Udp客户端绑定成功\n");
    */
    //变量初始化
    char buf[32]="";
    
    socklen_t sinlen=sizeof(sin);
    socklen_t cinlen=sizeof(cin);
    ssize_t sd=0,rcv=0;
    while(1)
    {

        //4、发送数据,要指定发送到的地址
        bzero(buf,sizeof(buf));
        printf("要发送到服务器的数据-->");
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf)-1] = 0;

         sd = sendto(sfd,&buf,sizeof(buf),0,(struct sockaddr*)&sin,sinlen);    
        if(sd<0)
        {
            ERR_MSG("sendto");
            return -1;
        }
        printf("发送成功\n");
    }
    //5、关闭套接字
    close(sfd);
    return 0;
}
**************************************************************************************************************

广播接收

**************************************************************************************************************

#include <stdio.h>
#include <sys/types.h>         
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>                          
#include <string.h>
#include <unistd.h>
#define PORT 8888
#define IP   "192.168.31.255"
#define ERR_MSG(msg) do{\
    fprintf(stderr,"__%d__\n",__LINE__);\
    perror("msg");\
}while(0)

int main(int argc, const char *argv[])
{
    //1、创建广播报式套接字
    int sfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sfd<0)
    {
        ERR_MSG("socket");
        return -1;
    }
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port  = htons(PORT);//广播端口号(主机端口号转为网络字节序)
    sin.sin_addr.s_addr  =inet_addr(IP);//广播IP的网络字节序
    //2、绑定广播IP地址、端口号和套接字的文件描述符上
    if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))<0)
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("Udp服务器绑定成功\n");
    //变量初始化
    char buf[32]="";
    struct sockaddr_in cin;
    socklen_t cinlen=sizeof(cin);

    while(1)
    {

        //3、接收数据
        ssize_t rcv=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&cinlen);
        if(rcv<0)
        {
            ERR_MSG("recvfrom");
            return -1;
        }
        printf("__%d__,%s:%d:%s\n",\
                __LINE__,inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);


    }
    //5、关闭套接字
    close(sfd);
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值