Here's some code that demos the problem:
The receiver:
Code:
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <strings.h>
int sock;
int main(int argc, char *argv[])
{
int addr_len;
struct sockaddr_in sin,sin_recv;
struct ip_mreq multi;
char mes[255];
bzero(&sin,sizeof(sin));
multi.imr_multiaddr.s_addr=inet_addr("230.4.4.1");
multi.imr_interface.s_addr=inet_addr("192.168.1.6"); // Fill in with your local IP
sin.sin_family = AF_INET;
// With this line uncommented, it works
//sin.sin_addr.s_addr=INADDR_ANY;
// With this line uncommented, it doesn't work
sin.sin_addr.s_addr=inet_addr("192.168.1.6"); // Fill in with your local IP
sin.sin_port = htons(1044);
if ((sock=socket(AF_INET,SOCK_DGRAM,0))==-1) {
perror("Error creating socket");
exit(1);
}
if (bind(sock,(struct sockaddr *)&sin,sizeof(sin))==-1) {
perror("Error binding socket");
close(sock);
exit(1);
}
if (setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&multi,sizeof(multi))== -1) {
perror("Error joining multicast group");
close(sock);
exit(1);
}
while (1) {
bzero(mes,sizeof(mes));
bzero(&sin_recv,sizeof(sin_recv));
addr_len=sizeof(sin_recv);
printf("Waiting for packet...\n");
if (recvfrom(sock,mes,sizeof(mes),0,(struct sockaddr *)&sin_recv,&addr_len)==-1) {
perror("error recving socket");
close(sock);
exit(1);
}
printf("Got packet\n");
printf("Origin: %s port %d\n",inet_ntoa(sin_recv.sin_addr),sin_recv.sin_port);
printf("Message: %s\n",mes);
}
return 0;
}
The sender:
Code:
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <string.h>
#include <strings.h>
int sock;
int main(int argc, char *argv[], char *envp[])
{
struct sockaddr_in sin;
struct in_addr out_addr;
char mes[255], ttl;
int c;
ttl=1;
out_addr.s_addr=htonl(INADDR_ANY);
while ((c = getopt(argc, argv, "t:I:")) != EOF)
switch (c) {
case 't':
ttl=optarg[0];
break;
case 'I':
if (inet_addr(optarg)!=-1)
out_addr.s_addr=inet_addr(optarg);
break;
case '?':
printf("Unknown option: %s\n",optarg);
break;
}
argc-=optind;
argv+=optind;
printf("Enter message: ");
fgets(mes,sizeof(mes),stdin);
bzero(&sin,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=inet_addr(argv[0]);
sin.sin_port=htons(atoi(argv[1]));
if ((sock=socket(AF_INET,SOCK_DGRAM,0))==-1) {
perror("Error creating socket");
exit(1);
}
if (setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,(char *)&ttl,sizeof(ttl))== -1) {
perror("Error setting ttl");
close(sock);
exit(1);
}
if (setsockopt(sock,IPPROTO_IP,IP_MULTICAST_IF,(char *)&out_addr,sizeof(out_addr))== -1) {
perror("Error setting outgoing interface");
close(sock);
exit(1);
}
if (sendto(sock,mes,strlen(mes),0,(struct sockaddr *)&sin,sizeof(sin))==-1) {
perror("Send error");
}
}