广播编程之接受者

广播实现一对多的通信,通过向广播地址发送数据报文实现

只有udp的程序才能广播,tcp不能

 

----------------------------------------------

#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>

int sockfd;

void sig_handler(int signo)
{
    if(signo == SIGINT)
    {
        printf("server close\n");
        close(sockfd);
        exit(1);
    }
}

int main(int argc,char *argv[])
{
     if(argc < 2)
     {
        fprintf(stderr,"usage:%s port\n",argv[0]);
        exit(1);
     }
    
     if(signal(SIGINT,sig_handler)== SIG_ERR)
     {
        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(atom(argv[1]));
     serveraddr.sin_addr.s_addr = INADDR_ANY;
     if((bind(sockfd,(struct sockaddr*)&serveraddr,
                      sizeof(serveraddr))) < 0)
      {
        perror("bind error");
        exit(1);
      }
      
    
      char buffer[1024];
      struct sockaddr_in clientaddr;
      socklen_t len= sizeof(clientaddr);
      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);
         }
      }
      
      return 0;
}







 

posted @ 2017-03-05 21:01  lvdh1314  阅读(146)  评论(0编辑  收藏  举报