#发送
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define N 64//定义数据大小
typedef struct sockaddr SA;
int main(int argc, const char *argv[])
{
int sockfd;;//创建套接字
int cnt = 0;
char buf[N]="This is a multicast package\n";
struct sockaddr_in dstaddr;//本地地址
if(argc<3)//检查命令行
{
printf("Usage :<%s><ip><port>\n",argv[0]);
return -1;
}
if((sockfd=socket(PF_INET,SOCK_DGRAM,0))==-1)//建立数据包套接字
{
perror("fail to socket");
exit(-1);
}
bzero(&dstaddr,sizeof(dstaddr));//数据清零
dstaddr.sin_family=PF_INET;//协议族
dstaddr.sin_port=htons(atoi(argv[2]));//端口
dstaddr.sin_addr.s_addr=inet_addr(argv[1]);//本地地址;
while(1)
{
sendto(sockfd,buf,N,0,(SA *)&dstaddr,sizeof(dstaddr));//发送数据包
cnt++;
printf("send cnt is %d\n",cnt);
sleep(5);
}
return 0;
}
#接收
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#define N 64//缓冲区大小
typedef struct sockaddr SA;
int main(int argc, const char *argv[])
{
int sockfd;
char buf[N];
struct sockaddr_in myaddr,peeraddr;
socklen_t peerlen=sizeof(peeraddr);
struct ip_mreq mreq;//加入广播组
if(argc<3)//检查命令行参数
{
printf("Usage:<%s><ip><port>\n",argv[0]);
return -1;
}
if((sockfd=socket(PF_INET,SOCK_DGRAM,0))==-1) //创建套接字文件描述
{
perror("fail to socket");
exit(-1);
}
bzero(&mreq,sizeof(mreq));//清零
mreq.imr_multiaddr.s_addr=inet_addr(argv[1]);//组播地址
mreq.imr_interface.s_addr=htonl(INADDR_ANY);//网络接口默认
if(setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))<0)//将本机加入组播
{
perror("fail to setsockopt");
exit(-1);
}
bzero(&myaddr,sizeof(myaddr));//清零
myaddr.sin_family=PF_INET;//协议族
myaddr.sin_port=htons(atoi(argv[2]));//端口号
myaddr.sin_addr.s_addr=inet_addr(argv[1]);//本地地址;
if(bind(sockfd,(SA *)&myaddr,sizeof(myaddr))<0)//绑定
{
perror("fail to bind");
exit(-1);
}
while(1)
{
recvfrom(sockfd,buf,N,0,(SA *)&peeraddr,&peerlen);//接收数据包
printf("[%s:%d]%s\n",inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port),buf);
}
return 0;
}