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