ubuntu 1604 1804組播測試程序!

ubuntu 1804組播測試程序
1.server.cpp
模擬服務器,發送端消息;
編譯命令: g++ -o server server.cpp
2.client.cpp
接受服務器,接受組播消息;
編譯命令: g++ -o client client.cpp
3.使用
打開終端a:
    ./server
打開終端b:
    ./client
在a終端 鍵盤隨便輸入字母,按回車鍵,看b終端是否有消息收到;


====client.cpp  begin=====
#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>
 
#define BUFLEN 255
 
 /*設置組播的 ip 和 端口,只修改這裏即可*/
 const char *pGroupIp = "226.1.1.10";
 const int nGroupPort = 10086; 
 
 /*=======================================================================*/
int main (int argc, char **argv) 
{  
    printf("======GroupIpPort: %s:%d======\n", pGroupIp, nGroupPort);
    struct sockaddr_in peeraddr,ia;  
    int sockfd; 
    char recmsg[BUFLEN + 1]; 
    unsigned int socklen, n; 
    struct ip_mreq mreq; 
 
    /* 創建 socket 用於UDP通訊 */ 
    sockfd = socket (AF_INET, SOCK_DGRAM, 0); 
    if (sockfd < 0)
    {          
        printf ("socket creating err in udptalk\n");          
        exit (1);        
    } 
    /* 設置要加入組播的地址 */ 
    bzero(&mreq, sizeof (struct ip_mreq)); 
    
    //inet_pton(AF_INET,"226.0.1.192",&ia.sin_addr);
    inet_pton(AF_INET, pGroupIp, &ia.sin_addr); //設置組播ip;
    
    /* 設置組地址 */ 
    bcopy (&ia.sin_addr.s_addr, &mreq.imr_multiaddr.s_addr, sizeof (struct in_addr)); 
    /* 設置發送組播消息的源主機的地址信息 */ 
    mreq.imr_interface.s_addr = htonl (INADDR_ANY);  
    //mreq.imr_interface.s_addr = inet_addr("192.168.42.171");  
 
    /* 把本機加入組播地址,即本機網卡作爲組播成員,只有加入組才能收到組播消息 */ 
    if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,sizeof (struct ip_mreq)) == -1)
    {     
        perror ("asdfsetsockopt");      
        exit (-1);   
    }
 
    socklen = sizeof (struct sockaddr_in); 
    memset (&peeraddr, 0, socklen); 
    peeraddr.sin_family = AF_INET;
    
    //peeraddr.sin_port = htons (7838);
    //inet_pton(AF_INET, "226.0.1.192", &peeraddr.sin_addr); 
    peeraddr.sin_port = htons (nGroupPort); //設置組播端口;
 
    /* 綁定自己的端口和IP信息到socket上 */ 
    if (bind(sockfd, (struct sockaddr *) &peeraddr,sizeof (struct sockaddr_in)) == -1)
    {      
        printf ("Bind error\n");      
        exit (0);    
    }
  
    /* 循環接收網絡上來的組播消息 */ 
    for (;;)
    {     
        bzero (recmsg, BUFLEN + 1);     
        n = recvfrom (sockfd, recmsg, BUFLEN, 0, (struct sockaddr *) &peeraddr, &socklen);
        if (n < 0)
        {      
            printf ("recvfrom err in udptalk!\n");      
            exit (4);    
        }
        else{      
        /* 成功接收到數據報 */ 
            recmsg[n] = 0;      
            printf("Recv Ok! %s",recmsg);
        }
    
    }
 
}
 ====client.cpp  end=====

 

========server.cpp beigin===========
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define BUFLEN 255
 
 /*設置組播的 ip 和 端口,只修改這裏即可*/
const char *pGroupIp = "226.1.1.10";
const int nGroupPort = 10086;
 
 
 
 /*=======================================================================*/
int main (int argc, char **argv) 
{
    printf("======GroupIpPort: %s:%d======\n", pGroupIp, nGroupPort);
    struct sockaddr_in peeraddr, myaddr; 
    int sockfd;  
    char recmsg[BUFLEN + 1];
    char printmsg[BUFLEN + 1];
    unsigned int socklen;
    socklen = sizeof (struct sockaddr_in);  
 
    /* 創建 socket 用於UDP通訊 */ 
    sockfd = socket (AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {      
        printf ("socket creating error\n");     
        exit (1);   
    }  
  
    /* 設置對方的端口和IP信息 */ 
    memset (&peeraddr, 0, socklen); 
    peeraddr.sin_family = AF_INET;  
    peeraddr.sin_port = htons (nGroupPort); //設置組播端口;
   inet_pton (AF_INET, pGroupIp, &peeraddr.sin_addr); //設置組播ip;
  //  inet_pton (AF_INET, "192.168.0.100", &peeraddr.sin_addr);
 
  
/* 設置自己的端口和IP信息 */ 
    memset (&myaddr, 0, socklen); 
    myaddr.sin_family = AF_INET; 
    myaddr.sin_port = htons (23456); 
   // myaddr.sin_addr.s_addr = inet_addr("192.168.42.171") ;
    myaddr.sin_addr.s_addr = htonl (INADDR_ANY) ;
  
    /* 綁定自己的端口和IP信息到socket上 */ 
    if (bind (sockfd, (struct sockaddr *) &myaddr,     sizeof (struct sockaddr_in)) == -1)
    {     
        printf ("Bind error\n");     
        exit (0);  
    }
  
    /* 循環接受用戶輸入的消息發送組播消息 */ 
    for (;;)
    {      
        /* 接受用戶輸入 */ 
        bzero (recmsg, BUFLEN + 1);     
        if (fgets (recmsg, BUFLEN, stdin) == (char *) EOF)    
            exit (0);
          
        /* 發送消息 */ 
        if (sendto(sockfd, recmsg, strlen (recmsg), 0, (struct sockaddr *) &peeraddr, sizeof (struct sockaddr_in)) < 0)
        {      
            printf ("sendto error!\n");      
            exit (3);    
        }
        memcpy(printmsg, recmsg, strlen(recmsg)-1);
        printmsg[strlen(recmsg)-1] = '\0';
        //printf ("\"%s\" send ok\n", recmsg);
        printf("Send Ok! '%s'\n", printmsg);
    } 
}
========server.cpp end===========

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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