1.组播服务端代码(数据发送端)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define BUF_SIZE 128
#define PORT 50001
#define ADDR "192.168.1.100"
#define MUNICASTADDR "235.3.3.3"
int main(int argc, char *argv[])
{
//建立套接字
int sock_fd = socket(AF_INET, SOCK_DGRAM, 0); //IPV4,数据报套接字类型,不指定协议
struct sockaddr_in group_addr;
memset(&group_addr, 0, sizeof(group_addr));
group_addr.sin_family = AF_INET, //协议类型IPV4
group_addr.sin_port = htons(PORT), //端口号-网络字节序
group_addr.sin_addr.s_addr = inet_addr(MUNICASTADDR); //IP地址-字符串转IP
//发送数据
char buf[BUF_SIZE] = { 0 };
int count = 0;
while (1)
{
memset(buf,0, BUF_SIZE);
sprintf(buf, "%d",count);
printf("udp client send:[%s - %d]:%s\n",ADDR,PORT,buf);
sendto(sock_fd, buf, strlen(buf), 0, (const struct sockaddr*)&group_addr, sizeof(group_addr));
count++;
sleep(1);
}
//关闭套接字
close(sock_fd);
return 0;
}
2.客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <iostream>
#include <fcntl.h>
using namespace std;
#define BUF_SIZE 128
#define MULTICASTPROT 50001
#define ADDR "192.168.1.100"
#define MUNICASTADDR "235.3.3.3"
#define RCV_BUF_SIZE 65535
void print_err(string str)
{
static char log_buf[1024];
sprintf(log_buf,"%d:%s",__LINE__,str.c_str());
cout<<log_buf<<endl;
}
int main(int argc, char *argv[])
{
//建立套接字
int sock_fd = socket(AF_INET, SOCK_DGRAM, 0); //IPV4,数据报套接字类型,不指定协议
if(sock_fd==-1)
{
print_err("creat socket failed!");
}
//socket可以重新使用一个本地地址
int flag=1;
if(setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&flag, sizeof(flag)) != 0)
{
print_err("setsockopt failed!");
}
int options = fcntl(sock_fd, F_GETFL);
if(options < 0)
{
print_err("get fcntl failed!");
}
options = options | O_NONBLOCK;
int i_ret = fcntl(sock_fd, F_SETFL, options);
if(i_ret < 0)
{
print_err("get non-block failed!");
}
//声明将连接地址
struct sockaddr_in group_addr;
memset(&group_addr, 0, sizeof(group_addr));
group_addr.sin_family = AF_INET, //协议类型IPV4
group_addr.sin_port = htons(MULTICASTPROT), //端口号-网络字节序
group_addr.sin_addr.s_addr = inet_addr(MUNICASTADDR); //IP地址-字符串转IP
if (bind(sock_fd, (struct sockaddr*)&group_addr, sizeof(group_addr)) < 0) //bind multicast addr
{
print_err("bond socket failed!");
}
struct ip_mreq ipMreq;
ipMreq.imr_interface.s_addr = inet_addr(ADDR);
ipMreq.imr_multiaddr.s_addr = inet_addr(MUNICASTADDR);
if(setsockopt(sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &ipMreq, sizeof(ipMreq))!=0)
{
print_err("add multicast membership failed!");
}
//接收数据
char buf[BUF_SIZE] = { 0 };
struct sockaddr_in cliaddr;
socklen_t cliaddrlen = sizeof(cliaddr);
while (1)
{
bzero(buf, BUF_SIZE);
bzero(&cliaddr, cliaddrlen);
recvfrom(sock_fd, buf, BUF_SIZE, 0, (struct sockaddr *)&cliaddr, &cliaddrlen);
printf("udp server from [%s - %hu]:%s\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port),buf);
sleep(1);
}
//关闭套接字
close(sock_fd);
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)