linux下怎么使用C语言编写接收和发送udp组播数据?

linux下怎么使用C语言编写接收和发送udp组播数据?

2023年7月15日发(作者:)

linux下怎么使⽤C语⾔编写接收和发送udp组播数据?⼀,发送端代码如下:先调⽤initUdpMultiCastSender初始化,

int initUdpMultiCastSender(uint32_t localip,uint16_t localport){ int sockfd = socket(AF_INET,SOCK_DGRAM,0); if (-1 == sockfd) { printf("[initUdpMultiCastSender]socket failn"); return -1; } struct sockaddr_in myaddr; memset(&myaddr,0,sizeof(myaddr)); _family = AF_INET; _port = htons(localport); _addr.s_addr = localip; int bindret = bind(sockfd,(struct sockaddr *)(&myaddr),sizeof(struct sockaddr)); if (-1 == bindret) { perror("[initUdpMultiCastSender]bind failn"); close(sockfd); return -1; } return sockfd;}后使⽤sendUdpMultiCast发送数据,

int sendUdpMultiCast(int sockfd,char *pMultiCastIp,uint16_t multicastPort,void *data,uint32_t len){ struct sockaddr_in destAddr; _family = AF_INET; _addr.s_addr = inet_addr(pMultiCastIp); _port = htons(multicastPort); int sendLen = sendto(sockfd,data,len,0,(struct sockaddr *)(&destAddr),sizeof(struct sockaddr)); return sendLen;}

发送端的代码,整体的思路就是创建socket->绑定本地ip,port(注意,该port不是组播port,⽽是本地port,指定个未使⽤的即可)->发送数据(注意,发送的ip和port为组播ip,port)

⼆、接收端

int sockfd = socket(AF_INET,SOCK_DGRAM,0); if (-1 == sockfd) { perror("socket failn"); return -3; } printf("socket succn"); struct ip_mreq mreq; memset(&mreq,0,sizeof(struct ip_mreq)); _interface.s_addr = htonl(INADDR_ANY); _multiaddr.s_addr = inet_addr(pUdpMultiCastIp); int setoptret = setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(struct ip_mreq)); if (-1 == setoptret) { perror("setsockopt failn"); return -4; } printf("setsockopt ip_add_membership succn"); struct sockaddr_in peeraddr; memset(&peeraddr,0,sizeof(struct sockaddr_in)); _family = AF_INET; _addr.s_addr = inet_addr(pUdpMultiCastIp); _port = htons(udpMultiCastPort); int bindRet = bind(sockfd,(struct sockaddr *)(&peeraddr),sizeof(struct sockaddr)); if (-1 == bindRet) { perror("bind failn"); return -5; } printf("bind succn"); while(1) { char buffer[1024] = {0}; socklen_t addrLen = sizeof(struct sockaddr); printf("ready 2 recvn"); int recvRet = recvfrom(sockfd,buffer,sizeof(buffer)-1,0,(struct sockaddr*)(&peeraddr),&addrLen); if (-1 == recvRet) { perror("recvfrom failn"); break; } printf("recvfrom succ,buffer is %sn",buffer); }接收端的代码,整体的思路就是创建socket->加⼊组播(本地地址和组播地址赋值给mreq)->绑定ip,port(注意,该ip和port是组播ip和组播port)->接收数据(注意,接收的ip和port为组播ip,port)

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689410023a243511.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信