/*
* *multicast_recv.c
* */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define MCAST_PORT 8888
#define MCAST_ADDR "224.0.0.100" /*一个局部连接多播地址,路由器不进行转发*/
#define LOCAL_ADDR "192.168.50.21" /*本机网卡地址*/
#define MCAST_INTERVAL 5 /*发送间隔时间*/
#define BUFF_SIZE 256 /*接收缓冲区大小*/
int main(int argc, char*argv[])
{
struct sockaddr_in local_addr; /*本地地址*/
int fd = socket(AF_INET, SOCK_DGRAM, 0); /*建立套接字*/
if (fd == -1)
{
perror("socket()");
exit(1);
}
int yes = 1;
if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0)
{
perror("Reusing ADDR failed");
exit(1);
}
/*初始化本地地址*/
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
local_addr.sin_port = htons(MCAST_PORT);
/*绑定socket*/
int err = bind(fd,(struct sockaddr*)&local_addr, sizeof(local_addr)) ;
if(err < 0)
{
perror("bind()");
exit(1);
}
/*设置回环许可*/
int loop = 1;
err = setsockopt(fd,IPPROTO_IP, IP_MULTICAST_LOOP,&loop, sizeof(loop));
if(err < 0)
{
perror("setsockopt():IP_MULTICAST_LOOP");
exit(1);
}
/*加入多播组*/
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(MCAST_ADDR); /*多播地址*/
mreq.imr_interface.s_addr = htonl(INADDR_ANY); /*本地网络接口为默认*/
/*将本机加入多播组*/
err = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreq, sizeof(mreq));
if (err < 0)
{
perror("setsockopt():IP_ADD_MEMBERSHIP");
exit(1);
}
int times = 0;
int addr_len = sizeof(local_addr);
char buff[BUFF_SIZE];
int n = 0;
/*循环接收多播组的消息,5次后退出*/
while(1)
{
memset(buff, 0, BUFF_SIZE); /*清空接收缓冲区*/
/*接收数据*/
n = recvfrom(fd, buff, BUFF_SIZE, 0,(struct sockaddr*)&local_addr,&addr_len);
if( n== -1)
{
perror("recvfrom()");
}
/*打印信息*/
printf("Recv %dst message from server:%s\n", ++times, buff);
}
/*退出多播组*/
err = setsockopt(fd, IPPROTO_IP, IP_DROP_MEMBERSHIP,&mreq, sizeof(mreq));
close(fd);
return 0;
}/*
* *broadcast_server.c - 多播服务程序
* */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define MCAST_PORT 8888
#define MCAST_ADDR "224.0.0.100" /*一个局部连接多播地址,路由器不进行转发*/
#define MCAST_DATA "BROADCAST TEST DATA" /*多播发送的数据*/
#define MCAST_INTERVAL 1 /*发送间隔时间*/
int main(int argc, char*argv)
{
struct sockaddr_in mcast_addr;
int fd = socket(AF_INET, SOCK_DGRAM, 0); /*建立套接字*/
if (fd == -1)
{
perror("socket()");
exit(1);
}
memset(&mcast_addr, 0, sizeof(mcast_addr));/*初始化IP多播地址为0*/
mcast_addr.sin_family = AF_INET; /*设置协议族类行为AF*/
mcast_addr.sin_addr.s_addr = inet_addr(MCAST_ADDR);/*设置多播IP地址*/
mcast_addr.sin_port = htons(MCAST_PORT); /*设置多播端口*/
/*向多播地址发送数据*/
while(1)
{
int n = sendto(fd,MCAST_DATA,sizeof(MCAST_DATA),0,(struct sockaddr*)&mcast_addr,sizeof(mcast_addr)) ;
if( n < 0)
{
perror("sendto()");
exit(1);
}
sleep(MCAST_INTERVAL); /*等待一段时间*/
}
return 0;
}#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#define MCAST_PORT 8888
#define LOCAL_ADDR "192.168.50.21" /*本机网卡地址*/
#define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); } while (0)
void echo_ser(int sock)
{
char recvbuf[1024] = {0};
struct sockaddr_in peeraddr;
socklen_t peerlen;
int i = 0;
while (1)
{
peerlen = sizeof(peeraddr);
memset(recvbuf, 0, sizeof(recvbuf));
int n = recvfrom(sock, recvbuf, sizeof(recvbuf), 0,
(struct sockaddr *)&peeraddr, &peerlen);
if (n == -1)
{
if (errno == EINTR)
continue;
ERR_EXIT("recvfrom error");
}
else if(n > 0)
{
printf("==>(%d)-%s\n",++i,recvbuf);
}
}
close(sock);
}
int main(void)
{
int sock;
if ((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
ERR_EXIT("socket error");
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(MCAST_PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
int yes = 1;
if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0)
{
perror("Reusing ADDR failed");
exit(1);
}
if (bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
ERR_EXIT("bind error");
echo_ser(sock);
return 0;
}#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#define MCAST_PORT 8888
#define LOCAL_ADDR "192.168.50.21" /*本机网卡地址*/
#define UDP_DATA "UDP TEST DATA" /*UDP发送的数据*/
#define UDP_INTERVAL 1 /*发送间隔时间*/
#define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); } while(0)
void echo_cli(int sock)
{
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(MCAST_PORT);
servaddr.sin_addr.s_addr = inet_addr(LOCAL_ADDR);
while (1)
{
int ret = sendto(sock, UDP_DATA, strlen(UDP_DATA), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));
if( ret < 0)
{
perror("sendto()");
exit(1);
}
sleep(UDP_INTERVAL); /*等待一段时间*/
}
close(sock);
}
int main(void)
{
int sock;
if ((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
ERR_EXIT("socket");
echo_cli(sock);
return 0;
}原文:http://blog.csdn.net/ctthuangcheng/article/details/49933485