Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #define MAX_LEN 20
- static int sock;
- static int flag_on = 1;
- static struct sockaddr_in multicast_addr;
- static char message_received[MAX_LEN+1];
- static int msgrecv_len;
- static struct ip_mreq mc_req;
- static char* multicast_ip="224.5.6.7";
- static unsigned short multicast_port=5006;
- static struct sockaddr_in from_addr;
- static unsigned int from_len;
- static char message_to_send[MAX_LEN];
- static unsigned int send_len;
- static unsigned char multicast_ttl=1;
- static struct sockaddr_in multicast_addr;
- int sender();
- int receiver();
- int sender()
- {
- /* create a socket */
- if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
- {
- perror("Socket creation failed");
- exit(1);
- }
- /* set the TTL (time to live/hop count) for the send */
- if ((setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (void*) &multicast_ttl, sizeof(multicast_ttl))) < 0)
- {
- perror("setsockopt() failed");
- exit(1);
- }
- memset(&multicast_addr, 0, sizeof(multicast_addr));
- multicast_addr.sin_family = AF_INET;
- multicast_addr.sin_addr.s_addr = inet_addr(multicast_ip);
- multicast_addr.sin_port = htons(multicast_port);
- //printf("Type the message below (Press Enter to send, ctrl-C to quit):\n");
- printf("NOW IN STATE SENDER!\n");
- memset(message_to_send, 0, sizeof(message_to_send));
- //while (fgets(message_to_send, MAX_LEN, stdin))
- while(1)
- {
- //message_to_send="batman";
- strcpy(message_to_send,"Hallo\n\0");
- printf("message to send: %s \n", message_to_send);
- send_len = strlen(message_to_send);
- if ((sendto(sock, message_to_send, send_len, 0,
- (struct sockaddr *) &multicast_addr,
- sizeof(multicast_addr))) != send_len)
- {
- perror("Error in number of bytes");
- exit(1);
- }
- memset(message_to_send, 0, sizeof(message_to_send));
- break;
- }
- printf("//switch to receiver()\n");
- close(sock);
- receiver();
- return 0;
- }
- int receiver()
- {
- printf("NOW IN STATE RECEIVER()\n");
- if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
- {
- perror("socket() failed");
- exit(1);
- }
- /* set reuse port to on to allow multiple binds per host */
- if ((setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag_on,
- sizeof(flag_on))) < 0)
- {
- perror("setsockopt() failed");
- exit(1);
- }
- /* construct a multicast address structure */
- memset(&multicast_addr, 0, sizeof(multicast_addr));
- multicast_addr.sin_family = AF_INET;
- multicast_addr.sin_addr.s_addr = htonl(INADDR_ANY);
- multicast_addr.sin_port = htons(multicast_port);
- /* bind to multicast address to socket */
- if ((bind(sock, (struct sockaddr *) &multicast_addr, sizeof(multicast_addr))) < 0)
- {
- perror("bind() failed");
- exit(1);
- }
- /* construct an IGMP join request structure */
- mc_req.imr_multiaddr.s_addr = inet_addr(multicast_ip);
- mc_req.imr_interface.s_addr = htonl(INADDR_ANY);
- /* send an ADD MEMBERSHIP message via setsockopt */
- if ((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*) &mc_req, sizeof(mc_req))) < 0)
- {
- perror("setsockopt() failed");
- exit(1);
- }
- while(1)
- {
- memset(message_received, 0, sizeof(message_received));
- from_len = sizeof(from_addr);
- memset(&from_addr, 0, from_len);
- /* block waiting to receive a packet */
- if ((msgrecv_len = recvfrom(sock, message_received, MAX_LEN, 0, (struct sockaddr*)&from_addr, &from_len)) < 0)
- {
- perror("recvfrom() failed");
- break;
- }
- printf("Received %d bytes from %s: ", msgrecv_len, inet_ntoa(from_addr.sin_addr));
- printf("%s", message_received);
- if(strcmp(message_received,"haha"))
- break;
- }
- printf("//switch to sender()\n");
- close(sock);
- sender();
- return 0;
- }
- int main(int argc, char *argv[])
- {
- /*
- if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
- {
- perror("socket() failed");
- exit(1);
- }
- set the TTL (time to live/hop count) for the send
- if ((setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (void*) &multicast_ttl, sizeof(multicast_ttl))) < 0)
- {
- perror("setsockopt() failed");
- exit(1);
- }
- set reuse port to on to allow multiple binds per host
- if ((setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag_on,
- sizeof(flag_on))) < 0)
- {
- perror("setsockopt() failed");
- exit(1);
- }
- bind to multicast address to socket
- if ((bind(sock, (struct sockaddr *) &multicast_addr, sizeof(multicast_addr))) < 0)
- {
- perror("bind() failed");
- exit(1);
- }
- *
- * */
- sender();
- //receiver();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment