LINUX C++ 廣播程式[LINUX_CPP_Broadcast]
LINUX C++ 廣播程式[LINUX_CPP_Broadcast]
資料來源: http://chriswenyuan.blogspot.com/2017/05/c-broadcast.html
Server 端程式
/* broadcast_server.c */
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <errno.h>
#include <unistd.h>
/*Set port number*/
#define PORT 8888
int main(){
int sockfd;
struct sockaddr_in server_addr, client_addr;
int so_broadcast = 1;
char buf[1024];
/*Create an IPv4 UDP socket*/
if((sockfd = socket(PF_INET, SOCK_DGRAM, 0))<0){
perror("socket");
return -1;
}
/*SO_BROADCAST: broadcast attribute*/
if(setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &so_broadcast, sizeof(so_broadcast))<0){
perror("setsockopt");
return -1;
}
server_addr.sin_family = AF_INET; /*IPv4*/
server_addr.sin_port = htons(INADDR_ANY); /*All the port*/
server_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST); /*Broadcast address*/
if((bind(sockfd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr))) != 0){
perror("bind");
return -1;
}
client_addr.sin_family = AF_INET; /*IPv4*/
client_addr.sin_port = htons(PORT); /*Set port number*/
client_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST); /*The broadcast address*/
int clientlen = sizeof(client_addr);
while(1){
printf("Please input your word :> ");
//scanf("%s", buf);
fgets(buf, sizeof(buf), stdin); /*U can enter string by yourself*/
/*Use sendto() to send messages to client*/
/*sendto() doesn't need to be connected*/
if((sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*)&client_addr, (socklen_t)clientlen)) < 0){
perror("sendto");
return -1;
}
else
printf("send msg %s\n", buf);
}
close(sockfd);
return 0;
}
Client 端程式
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <errno.h>
#include <unistd.h>
#define PORT 8888
int main(){
int sockfd;
struct sockaddr_in serv_addr, client_addr;
int yes = 1;
ssize_t size;
socklen_t addrlen = sizeof(client_addr);
char buf[200];
//Create an IPv4 and UDP socket
if((sockfd = socket(PF_INET, SOCK_DGRAM, 0))<0){
perror("socket");
return -1;
}
//Set the struct of sockaddr_in
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /*All the host*/
/*Set communication address can be reused*/
if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes))<0){
perror("setsockopt");
return -1;
}
if(bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) != 0){
perror("bind");
return -1;
}
while(1){
memset(buf, 0, 200); /*Clean up the buffer*/
size = 0;
/*Use recvfrom() to receive the messages from server*/
size = recvfrom(sockfd, buf, 200, 0, (struct sockaddr *)&client_addr, &addrlen);
if(size<0){
perror("recvfrom");
return -1;
}
//buf[size] = '\0'; /* '\0' means final character*/
printf("IP:%s msg: %s\n", inet_ntoa(client_addr.sin_addr), buf);
/*If the buffer message is "quit", we will close socket fd and end the process*/
if(strcmp(buf, "quit") == 0){
printf("system quit!\n");
close(sockfd);
return 0;
}
}
close(sockfd);
return 0;
}