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;
}