socket廣播編程

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章