xxxxxxyyttz

xiaoxiao2021-02-28  9

receiver.c

#include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #define HELLO_PORT 12345 #define HELLO_GROUP "225.0.0.37" #define SERVER_IP "192.168.1.128" #define LOCAL_IP "192.168.1.129" #define MSGBUFSIZE 256 int main(int argc, char *argv[]) { struct sockaddr_in addr; int fd, nbytes,addrlen; struct ip_mreq mreq; char msgbuf[MSGBUFSIZE]; u_int yes=1; /*** MODIFICATION TO ORIGINAL */ /* create what looks like an ordinary UDP socket */ if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) { perror("socket"); exit(1); } /**** MODIFICATION TO ORIGINAL */ /* allow multiple sockets to use the same PORT number */ if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0) { perror("Reusing ADDR failed"); goto exit; } /*** END OF MODIFICATION TO ORIGINAL */ /* set up destination address */ memset(&addr,0,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */ addr.sin_port=htons(HELLO_PORT); /* bind to receive address */ if (bind(fd,(struct sockaddr *)&addr,sizeof(addr)) < 0) { perror("bind"); goto exit; } /* use setsockopt() to request that the kernel join a multicast group */ mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP); mreq.imr_interface.s_addr=inet_addr(LOCAL_IP); if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) { perror("setsockopt"); goto exit; } /* now just enter a read-print loop */ while (1) { //ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen); addrlen=sizeof(addr); if ((nbytes=recvfrom(fd, msgbuf, MSGBUFSIZE, 0, (struct sockaddr *) &addr, (socklen_t *)&addrlen)) < 0) { perror("recvfrom"); goto exit; } puts(msgbuf); } exit: close(fd); return 0; }

sender.c

#include <stdio.h> #include <sys/socket.h> //AF_INET, SOCK_DGRAM #include <netinet/in.h> //sockaddr_in, ip_mreq #include <stdlib.h> //exit #include <string.h> //memset, strlen #define HELLO_PORT 12345 #define HELLO_GROUP "225.0.0.37" int main(int argc, char *argv[]) { struct sockaddr_in addr; struct in_addr localIntf; int fd, ttl; char *message="Hello, World!"; /* create what looks like an ordinary UDP socket */ if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) { perror("socket"); exit(1); } /* set up destination address */ memset(&addr,0,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_addr.s_addr=inet_addr(HELLO_GROUP); addr.sin_port=htons(HELLO_PORT); localIntf.s_addr = inet_addr("192.168.1.128"); if(setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localIntf, sizeof(localIntf)) < 0) { perror("set multicast interface"); goto exit; } printf("set multicast interface OK.\n"); ttl = 5; if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) < 0) { perror("set multicast ttl"); goto exit; } /* now just sendto() our destination! */ while (1) { if (sendto(fd,message, strlen(message), 0, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror("sendto"); goto exit; } printf("sent a message to multicast group.\n"); sleep(1); } exit: close(fd); return 0; }
转载请注明原文地址: https://www.6miu.com/read-2300066.html

最新回复(0)