linux之UDP之组播通信

#include "socketudp.h"

#include <iostream>

#include <stdio.h>

#include <sys/socket.h>

#include <unistd.h>

#include <sys/types.h>

#include <netdb.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <string.h>

extern "C"{

#include "iniparser.h"

}

using namespace std;

int socket_udp_Handle;

pthread_t socket_udp_thread;

pthread_mutex_t socket_udp_mutex;

#define SOCKETIPIP "192.168.0.197"

#define UdpRecvPort 6789

#define UdpRecvIP "239.0.0.1"

#define UdpSendPort 4567

#define UdpSendIP "239.0.0.2"

void* func_udp_thread_socket(void *arg){

printf("**************************************************\n");

printf("*************func_udp_thread_socket***************\n");

printf("**************************************************\n");

int ret = 0;

//定义本地IP端口

struct sockaddr_in addr;

bzero(&addr, sizeof(struct sockaddr_in));

addr.sin_family = AF_INET;

addr.sin_port = htons(UdpRecvPort);

addr.sin_addr.s_addr = htonl(INADDR_ANY);

printf("local sockaddr_in:IP:%s Port:%d\n",inet_ntoa(addr.sin_addr),UdpRecvPort);

//创建socket套接字

socket_udp_Handle = socket(AF_INET, SOCK_DGRAM, 0);

printf("socket(AF_INET, SOCK_DGRAM, 0) ret:%d\n",socket_udp_Handle);

if(socket_udp_Handle < 0){return NULL;}

//端口复用

int reuse = 1;

ret = setsockopt(socket_udp_Handle, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));

printf("setsockopt(socket_udp_Handle, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) ret:%d\n",ret);

if (ret < 0) {return NULL;}

//加入多播组

struct ip_mreq vmreq;

inet_pton(AF_INET,UdpRecvIP,&vmreq.imr_multiaddr); // 组播地址

inet_pton(AF_INET,SOCKETIPIP,&vmreq.imr_interface); // 需要添加到组的ip

ret=setsockopt(socket_udp_Handle,IPPROTO_IP,IP_ADD_MEMBERSHIP,&vmreq,sizeof(vmreq));

printf("setsockopt(socket_udp_Handle,IPPROTO_IP,IP_ADD_MEMBERSHIP,&vmreq,sizeof(vmreq)) ret:%d\n",ret);

if (ret < 0) {return NULL;}

//多播发送

struct in_addr interface_addr;

inet_pton(AF_INET, SOCKETIPIP, &interface_addr);

ret = setsockopt(socket_udp_Handle, IPPROTO_IP, IP_MULTICAST_IF, &interface_addr, sizeof(interface_addr));

printf("setsockopt(socket_udp_Handle, IPPROTO_IP, IP_MULTICAST_IF, &interface_addr, sizeof(interface_addr)) ret:%d\n",ret);

if (ret < 0) {return NULL;}

//绑定本机IP端口

ret = bind(socket_udp_Handle, (struct sockaddr*)&(addr), sizeof(struct sockaddr_in));

printf("bind(sock,IP:%s,Port:%d ret:%d\n",inet_ntoa(addr.sin_addr),UdpRecvPort,ret);

if(ret == -1){return NULL;}

//用来记录对方的IP端口

struct sockaddr_in from;

bzero(&from, sizeof(struct sockaddr_in));

//存放接收到的数据

char data[128];

//7.开始接收处理

while(1){

memset(data, 0x0, sizeof(data));

//1.开始接收数据

int len = sizeof(sockaddr_in);

int ret = recvfrom(socket_udp_Handle, data, 128, 0, (struct sockaddr*)&from, (socklen_t*)&len);

if(ret != 128){sleep(20);continue;}

//2.接收到一个数据包

string ip = inet_ntoa(from.sin_addr);

int port = ntohs(from.sin_port);

printf("1.Recv From: IP%s Port:%d ret:%d Data:",ip.c_str(),port,ret);

for(int i = 0; i< 10; i++){printf("%02X ", (unsigned char)data[i]);}printf("\n");

//3.发送数据包

struct sockaddr_in sendaddr;

memset(&sendaddr, 0, sizeof(sendaddr));

sendaddr.sin_family = AF_INET;

sendaddr.sin_port = htons(UdpSendPort);

sendaddr.sin_addr.s_addr = inet_addr(UdpSendIP);

ret = sendto(socket_udp_Handle, (const char*)data, 128, 0, (struct sockaddr*)&sendaddr, sizeof(sockaddr_in));

printf("2.Send To : IP:%s Port:%d ret:%d Data:",UdpSendIP,UdpSendPort,ret);

for(int i = 0; i< 10; i++){printf("%02X ", (unsigned char)data[i]);}

printf("\n\n");

}

}

相关推荐
mingjie12122 小时前
mac virtualbox虚拟机 ubuntu-server openclaw 访问配置
linux·运维·ubuntu·openclaw
藤谷性能2 小时前
Ubuntu 22.04:在双硬盘电脑上安装Ubuntu 22.04单系统
linux·运维·ubuntu
藤谷性能2 小时前
Ubuntu 22.04:安装后的工作
linux·运维·ubuntu
米糕闯编程2 小时前
Linux(CentOS10)安装、启动Redis8.6.2
linux·运维·服务器
Bert.Cai2 小时前
Linux ls命令详解
linux·运维
qq_297574672 小时前
【Kafka系列·入门第四篇】Kafka实操入门:环境部署(Windows/Linux)+ 简单消息收发
linux·windows·kafka
gfdhy2 小时前
【Linux服务器】基础服务实战部署|Nginx+MySQL+PHP+WordPress,让服务器真正可用
linux·服务器·mysql·nginx·php·毕设
风酥糖2 小时前
Android上部署Linux环境的方案总结对比
android·linux·运维
今夕资源网2 小时前
LANDrop 跨平台局域网文件传输工具 支持 iOS、Android、macOS、Windows、Linux、Android TV 等操作系统
android·linux·macos·跨平台·文件传输·局域网文件共享·局域网文件传输