server.c服務器部分
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc,char **argv)
{
if(argc!=2)
{
printf("usage: ./server <port>");
exit(0);
}
int sockfd;
//1.create a socket
if((sockfd = socket(PF_INET,SOCK_DGRAM,0))<0)
{
fprintf(stderr,"socket faield:%s\n",strerror(errno));
exit(-1);
}
//2.bind a addr struct
struct sockaddr_in local_ipv4_addr;
memset(&local_ipv4_addr,0,sizeof(local_ipv4_addr));
local_ipv4_addr.sin_family = AF_INET;
local_ipv4_addr.sin_port = htons(strtol(argv[1],NULL,10));
//綁定本機所有網絡接口
//local_ipv4_addr.sin_addr.s_addr = INADDR_ANY;
inet_pton(AF_INET,"127.0.0.1",&local_ipv4_addr.sin_addr);
if(bind(sockfd,(struct sockaddr*)&local_ipv4_addr,sizeof(local_ipv4_addr))<0)
{
fprintf(stderr,"bind failed:%s\n",strerror(errno));
exit(-1);
}
//3.sento/recvfrom
struct sockaddr_in peer_ipv4_addr;
char buf[255];
int ret_r;
socklen_t len = sizeof(peer_ipv4_addr);
if((ret_r=recvfrom(sockfd,buf,sizeof(buf)-1,0,(struct sockaddr*)&peer_ipv4_addr,&len))<0)
{
fprintf(stderr,"recv failed:%s\n",strerror(errno));
exit(-1);
}
buf[ret_r] = 0;
printf("broadcast msg: %s\n",buf);
//4.close
close(sockfd);
return 0;
}
client.c客戶機部分
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc,char **argv)
{
if(argc!=3)
{
printf("usage: ./client <port> <msg>");
exit(0);
}
int sockfd;
//1.create a socket
if((sockfd = socket(PF_INET,SOCK_DGRAM,0))<0)
{
fprintf(stderr,"socket faield:%s\n",strerror(errno));
exit(-1);
}
//1.1 set broadcast option
int optval = 1;
if(setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&optval,sizeof(optval))<0)
{
fprintf(stderr,"set broadcast option failed:%s\n",strerror(errno));
exit(-1);
}
//2.sento/recvfrom
struct sockaddr_in broadcast_addr;
memset(&broadcast_addr,0,sizeof(broadcast_addr));
broadcast_addr.sin_family = AF_INET;
broadcast_addr.sin_port = htons(strtol(argv[1],NULL,10));
broadcast_addr.sin_addr.s_addr = INADDR_BROADCAST;
int ret_w;
//writefully
if((ret_w=sendto(sockfd,argv[2],strlen(argv[2]),0,(struct sockaddr*)&broadcast_addr,sizeof(broadcast_addr)))<0)
{
fprintf(stderr,"send failed:%s\n",strerror(errno));
exit(-1);
}
printf("send msg success!\n");
//3.close
close(sockfd);
return 0;
}