#include #include #include #include #include #include #include #include #include #include "HeartBeatListener.h" #include "MKCommModel.h" pthread_t HeartBeatListener::start(void *pCommModel) { pthread_t listenThread; pthread_create(&listenThread, NULL, HeartBeatListener::initThread, pCommModel); return listenThread; } void *HeartBeatListener::initThread(void *pCommModelIn) { MKCommModel *pCommModel = reinterpret_cast(pCommModelIn); struct sockaddr_in addr; int fd, nbytes; socklen_t addrlen; struct ip_mreq mreq; char msgbuf[kMsgBufSize]; char *data; /* create what looks like an ordinary UDP socket */ if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) { perror("socket"); exit(1); } /* set up receive 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_addr.s_addr=inet_addr(HELLO_MESHIP); addr.sin_port=htons(MK_HEARTBEAT_PORT); int x = 1; //printf("SO_REUSEADDR val: %d\nShould be 2\n", SO_REUSEADDR); if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&x,sizeof(x)) < 0) { perror("setsockopt1"); exit(1); } /* bind to receive address */ if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0) { perror("bind"); exit(1); } /* use setsockopt() to request that the kernel join a multicast group */ mreq.imr_interface.s_addr=htonl(INADDR_ANY); while (1) { addrlen=sizeof(addr); if((nbytes = recvfrom(fd, msgbuf, kMsgBufSize, 0, (struct sockaddr *) &addr, &addrlen)) < 0) { perror("recvfrom"); exit(1); } else { HeartBeatPacket *new_packet = (HeartBeatPacket *)malloc(kMsgBufSize); memcpy(new_packet, msgbuf, nbytes); pCommModel->update(new_packet); free(new_packet); } } return NULL; }