以广播的方式打印日志

test.c用于测试以广播的方式发送打印信息(客户端)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <netinet/in.h>

int broadcast_log(int port, char *log)
{
    int sender_socket; //sender的socket
    struct sockaddr_in broadcast_addr; //广播地址
    char buff[BUFSIZ]; //字符缓冲
    int opt_so_broadcast = 1; //用于配置socket参数
    int myport = 0;
    int ret = 0;

    if(port <= 0 || log == NULL)
    {
        printf("\033[32m[%s:%d]\033[36m port = %d, log = %p\033[0m\n", __FUNCTION__, __LINE__, port, log);
        return -1;
    }

    myport = port;

    //初始化socket
    sender_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if(sender_socket <= 0)
    {
        printf("\033[32m[%s:%d]\033[36m sender_socket = %d\033[0m\n", __FUNCTION__, __LINE__, sender_socket);
        return sender_socket;
    }

    memset(&broadcast_addr, 0, sizeof(broadcast_addr));
    broadcast_addr.sin_family = AF_INET;
    broadcast_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
    broadcast_addr.sin_port = htons(myport);
    printf("\033[32m[%s:%d]\033[36m s_addr = %d, sin_port = %d\033[0m\n", __FUNCTION__, __LINE__, broadcast_addr.sin_addr.s_addr,
            broadcast_addr.sin_port);

    //设置socket可选项,因为默认生成的会阻止广播,所以要将可选项中的SO_BROADCAST标志置为1
    setsockopt(sender_socket, SOL_SOCKET, SO_BROADCAST, (void *)&opt_so_broadcast, sizeof(opt_so_broadcast));

    memset(buff, 0, sizeof(buff));
    snprintf(buff, sizeof(buff), "%s", log);
    //将数据发送到多播组
    ret = sendto(sender_socket, buff, strlen(buff), 0, (struct sockaddr *)&broadcast_addr, sizeof(broadcast_addr));
    printf("\033[32m[%s:%d]\033[36m ret = %d\033[0m\n", __FUNCTION__, __LINE__, ret);

    close(sender_socket);

    return 0;
}

void send_log(char *fmt, ...)
{
    char buff[BUFSIZ]; //字符缓冲
    va_list argptr;
    va_start(argptr, fmt);
    memset(buff, 0, sizeof(buff));
    vsnprintf(buff, sizeof(buff), fmt, argptr);
    va_end(argptr);
#if 1
    broadcast_log(51021, buff);
#else
    printf("%s", buff);
#endif
}

#define DEBUG(fmt, arg...) send_log("==>[%s:%d]"fmt"\n", __FUNCTION__, __LINE__, ##arg)

int main(int argc , char *argv[])
{
    DEBUG("test\n");
}

recv.c接收广播的信息,输出打印信息(服务端)

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

int main(int argc , char *argv[]){
    int receiver_socket;
    struct sockaddr_in receiver_addr;
    int str_len;
    char buff[BUFSIZ];
    int iIndex = 0;

     if(argc < 2){
        printf("Uasge : %s <GroupIP> <PORT> \n",argv[0]);
        return -1;
    }

    //初始化receiver_socket
    receiver_socket = socket(AF_INET,SOCK_DGRAM, IPPROTO_UDP);
    if(receiver_socket <= 0)
    {
        printf("\033[32m[%s:%d]\033[36m receiver_socket = %d\033[0m\n", __FUNCTION__, __LINE__, receiver_socket);
        return receiver_socket;
    }

    memset(&receiver_addr,0,sizeof(receiver_addr));
    receiver_addr.sin_family = AF_INET;
#if 0
    if(!inet_aton("12.12.12.30", &receiver_addr.sin_addr))
    {
        exit(1);
    }
#else
    receiver_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    //receiver_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
#endif
    receiver_addr.sin_port = htons(atoi(argv[1]));

    printf("\033[32m[%s:%d]\033[36m s_addr = %d, sin_port = %d\033[0m\n", __FUNCTION__, __LINE__, receiver_addr.sin_addr.s_addr, receiver_addr.sin_port);
     //绑定地址
    if(bind(receiver_socket,(struct sockaddr *)&receiver_addr,sizeof(receiver_addr)) == -1)
    {
        printf("\033[32m[%s:%d]\033[36m blind error\033[0m\n", __FUNCTION__, __LINE__);
        close(receiver_socket);
        return -1; 
    }

    setvbuf(stdout, NULL, _IONBF, 0);

    while(1)
    {
        memset(buff, 0, sizeof(buff));
        str_len = recvfrom(receiver_socket, buff, sizeof(buff)-1,0,NULL,0);
        if(str_len <= 0)
        {
            continue;
        }
        buff[sizeof(buff) - 1] = 0;
        for(iIndex = 0; iIndex < str_len; iIndex++)
        {
            printf("%c", buff[iIndex]);
        }
        //printf("\n");
    }
    close(receiver_socket);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值