便于有需要的小伙伴测试使用(linux环境C语言):
UDP Broadcast Server,接受Client端发送的广播信息,以及获取并打印Client的IP地址,在接收到done后停止并退出。
大致流程是创建一个socket并绑定一个INADDR_ANY的本地地址,接受消息。
/*######udp broadcast server######*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main(void)
{
int sock;
struct sockaddr_in own_addr, peer_addr;
const int opt = 1;
char recv_msg[100] = {0};
socklen_t peer_addrlen = 0;
char peer_name[30] = {0};
int ret = 0;
bzero(&own_addr, sizeof(struct sockaddr_in));
bzero(&peer_addr, sizeof(struct sockaddr_in));
own_addr.sin_family = AF_INET;
own_addr.sin_port = htons(6868);
own_addr.sin_addr.s_addr = htonl(INADDR_ANY);
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1)
printf("Ceate sock fail\n");
// ret = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));
// if (ret)
// printf("Set sock to broadcast format fail\n");
ret = bind(sock, (struct sockaddr *)&own_addr, sizeof(struct sockaddr_in));
if (ret == -1)
printf("Bind addr fail\n");
while (1) {
ret = recvfrom(sock, recv_msg, sizeof(recv_msg), 0,
(struct sockaddr *)&peer_addr, &peer_addrlen);
if (ret > 0) {
inet_ntop(AF_INET, &peer_addr.sin_addr.s_addr,
peer_name, sizeof(peer_name));
printf("Recv from %s, msg[%s]\n", peer_name, recv_msg);
if (!strcmp("done", recv_msg))
break;
} else
printf("Recv msg err\n");
bzero(recv_msg, sizeof(recv_msg));
}
printf("Done\n");
}
UDP Broadcast Client:向外广播UDP包,退出时发送“done”消息。
大致流程是创建一个socket,并用setsockopt函数声明这是一个broadcast类型的socket,然后通过这个socket向INADDR_BROADCAST("255.255.255.255")发送消息。
/*######udp broadcast client######*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int g_exit = 0;
static void sighandle(int sign)
{
g_exit = 1;
}
static void send_msg(int sock, char *msg, int msg_len,
struct sockaddr *peer_addr, socklen_t peer_addrlen)
{
int ret = 0;
ret = sendto(sock, msg, msg_len, 0,
peer_addr, peer_addrlen);
if (ret > 0) {
printf("Send msg success\n");
} else
printf("Send msg err\n");
}
int main(void)
{
int sock;
struct sockaddr_in peer_addr;
const int opt = 1;
char msg[100] = "Msg from udp broadcast client!";
socklen_t peer_addrlen = 0;
int ret = 0;
signal(SIGINT, sighandle);
signal(SIGTERM, sighandle);
bzero(&peer_addr, sizeof(struct sockaddr_in));
peer_addr.sin_family = AF_INET;
peer_addr.sin_port = htons(6868);
peer_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
peer_addrlen = sizeof(struct sockaddr_in);
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1)
printf("Ceate sock fail\n");
ret = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));
if (ret == -1)
printf("Set sock to broadcast format fail\n");
while (!g_exit) {
send_msg(sock, msg, sizeof(msg),
(struct sockaddr *)&peer_addr, peer_addrlen);
sleep(1);
}
memset(msg, 0, sizeof(msg));
memcpy(msg, "done", 5);
send_msg(sock, msg, sizeof(msg),
(struct sockaddr *)&peer_addr, peer_addrlen);
printf("Done\n");
}