socket 广播 客户端接受不到信息

海子IT 发布于 2012/11/06 15:43
阅读 715
收藏 0

在做socket广播作业,客户端接受不到服务端发来的信息,但服务端可以接受客户端发来信息。求帮助!代码如下:

server:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
//#define SERVER_PORT 1500
#define MAX_MSG 100
void main()
{
    int sd, rc, n, cliLen;
    struct ip_mreq mreq;
      struct sockaddr_in cliAddr, servAddr;
      struct in_addr mcastAddr;
      struct hostent *h;
      char msg[MAX_MSG];

    char MCAddr[20];
    printf("Enter muticast address:\n");
    gets(MCAddr);    
    printf("%s\n",MCAddr);
    
    int SERVER_PORT;
    printf("Enter muticast Port Number:\n");
    scanf("%d",&SERVER_PORT);

     /* get mcast address to listen to */
      h=gethostbyname(MCAddr);
      if(h==NULL)
       {
            printf("unknown group '%s'\n",mcastAddr);
            exit(1);
      }
 
      memcpy(&mcastAddr, h->h_addr_list[0],h->h_length);
      
      /* check given address is multicast */
      if(!IN_MULTICAST(ntohl(mcastAddr.s_addr)))
      {
            printf("the given address '%s' is not multicast\n",inet_ntoa(mcastAddr));
            exit(1);
      }

    /* create socket */
      sd = socket(AF_INET,SOCK_DGRAM,0);
      if(sd<0)
      {
            printf("%s : cannot create socket\n",MCAddr);
            exit(1);
      }

    /* bind port */
      servAddr.sin_family=AF_INET;
      servAddr.sin_addr.s_addr=htonl(INADDR_ANY);
      servAddr.sin_port=htons(SERVER_PORT);  
      if(bind(sd,(struct sockaddr *) &servAddr, sizeof(servAddr))<0)
      {
            printf("%s : cannot bind port %d \n",MCAddr,SERVER_PORT);
            exit(1);
      }
      printf("1111111111111111111111111111111111/n");
      /* join multicast group */
      mreq.imr_multiaddr.s_addr=mcastAddr.s_addr;
      mreq.imr_interface.s_addr=htonl(INADDR_ANY);
     printf("222222222222222222222222222222222222/n");
      rc = setsockopt(sd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void *) &mreq, sizeof(mreq));
      printf("333333333333333333333333333333333333/n");
      if(rc<0)
      {
            printf("the server cannot join multicast group '%s'",inet_ntoa(mcastAddr));
            exit(1);
      }
  /*----------------------------------------FINISH SET UP MCAST---------------------------------------------------------------------------*/
 
 

/*----------------------------------------------UDP MCAST CONNECT SUCCESSFUL--------------------------------------------------------------------*/
      else
      {
 
            printf("the server : listening to mgroup %s:%d\n",inet_ntoa(mcastAddr), SERVER_PORT);
 
        printf("UDP Multicast test\n");
        
        
           
           
               char stest[100];
            cliLen=sizeof(cliAddr);
            int ntest = recvfrom(sd,stest,100,0,(struct sockaddr *) &cliAddr,&cliLen);
            printf("the client from %s:%d : %s\n",inet_ntoa(cliAddr.sin_addr),ntohs(cliAddr.sin_port),stest);
            printf("(((((((((((((((((((((((((((())))))))))))))))))))))))))))\n");

            

            if(ntest>0)
            {
                printf("the received message: %s\n",stest);
                printf("got message\n");
                int rc = sendto(sd,stest,strlen(stest)+1,0, &servAddr, sizeof(servAddr));    
                printf("%d\n",rc);
                printf("88888888888888888888888888888888888888888\n");
            }
            else
            {
                printf("didnot get message");
                    
            }
            
  }

Client:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#define MAX_MSG 100


/*----------------------------------client send message--------------------------------------------------------------------------------------*/
 


void main()
{
/*--------------------------------------------------------*/
    char MCAddr[20];
    printf("Enter muticast address:\n");
    gets(MCAddr);    
    
    int SERVER_PORT;
    printf("Enter muticast Port Number:\n");
    scanf("%d",&SERVER_PORT);
    
    int sd, rc,n, i;
      unsigned char ttl = 1;
      struct sockaddr_in cliAddr, servAddr;
      struct hostent *h;
      
      

    h = gethostbyname(MCAddr);
      if(h==NULL)
       {
            printf("0000000000000000000000000000\n");
            exit(1);
      }

      servAddr.sin_family = h->h_addrtype;
      memcpy((char *) &servAddr.sin_addr.s_addr, h->h_addr_list[0],h->h_length);
      servAddr.sin_port = htons(SERVER_PORT);
 
      /* check if dest address is multicast */
      if(!IN_MULTICAST(ntohl(servAddr.sin_addr.s_addr)))
      {
            printf("the given address '%s' is not multicast \n",inet_ntoa(servAddr.sin_addr));
            exit(1);
      }

      /* create socket */
      sd = socket(AF_INET,SOCK_DGRAM,0);
      if (sd<0)
      {
            printf("the client cannot open socket\n");
            exit(1);
      }
      
      struct ip_mreq mreq;

    mreq.imr_multiaddr.s_addr= inet_addr(MCAddr);

    mreq.imr_interface.s_addr= htonl(INADDR_ANY);

      /* bind any port number */
      memset(&cliAddr,0,sizeof(cliAddr));
      cliAddr.sin_family = AF_INET;
      cliAddr.sin_addr.s_addr = htonl(INADDR_ANY);
      cliAddr.sin_port = htons(0);
      if(bind(sd,(struct sockaddr *) &cliAddr,sizeof(cliAddr))<0)
      {
            perror("bind");
            exit(1);
      }
        //setsockopt(sd,IPPROTO_IP,IP_MULTICAST_TTL, &ttl,sizeof(ttl))
      if(setsockopt(sd,IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreq, sizeof(mreq))<0)
      {
            printf("setsockopt()");
            exit(1);
      }

      printf("the client sending data on multicast group '%s' (%s)\n",h->h_name,inet_ntoa(*(struct in_addr *) h->h_addr_list[0]));
      char test[100]="testtesttesttesttest";
      int tsize=sizeof(test);
      rc = sendto(sd,test,tsize,0,(struct sockaddr *) &servAddr, sizeof(servAddr));
      if(rc>0)
      {
          printf("yes\n");
          
      }
      else
      {
          printf("no\n");
      }
/*---------------------------FINISH MCAST SET UP---------------------------------------------------------------------------*/
 
 
         //int cliLen=sizeof(cliAddr2);
         printf("xxxxxxxxxxxxxxxxxxxxxxxxxxxx\n");
         char msg[MAX_MSG];
         int daxiao=sizeof(struct sockaddr_in);
         n = recvfrom(sd,msg,MAX_MSG,0,&servAddr,&daxiao);
         //int nr=recvfrom(sd,msg,MAX_MSG,nr,NULL,NULL);
         printf("cccccccccccccccccccccccccccccccccc\n");
         printf("n===========%d\n",n);
          if(n<0)
          {
        printf("the client cannot receive data\n");
        
          }
          else if(n>0)
          {
              
              printf("the client received message is :%s\n",msg);
          }

          //printf("the client from %s:%d on %s : %s\n",inet_ntoa(cliAddr.sin_addr),ntohs(cliAddr.sin_port),argv[1],msg);
              
          printf("%s\n",msg);
               
    
}





























}

加载中
返回顶部
顶部