使用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

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

被折叠的 条评论
为什么被折叠?



