static void registerEventCallback(char *name, char *buf, int bufSize, void *arg, bool isSynch, int retSize, char *retData, int type) { printf("REGISTER EVENT CALLBACK %s %s\n", name, buf); EventMessage *evMessage = new EventMessage(buf); int msgLen; char *msg = evMessage->serialize(msgLen, msgManager); for(int i = 0; i < numExtAddresses; i++) { try { msgManager->sendMessage(extAddresses[i], msg, msgLen); }catch(SystemException *exc) { printf("Error Sending registration message: %s\n", exc->what()); } } ((UDPNetworkManager*)udpMsgManager)->join(getMulticastAddr(evMessage->name)); delete [] msg; delete evMessage; }
void addExternalListener(NetworkAddress *addr) { bool exists = false; ExternalListener *currListener = extListenerHead; while(!exists && currListener) { exists = currListener->addr->equals(addr); currListener = currListener->nxt; } if(exists) return; ExternalListener *newListener = new ExternalListener(addr); newListener->nxt = extListenerHead; if(extListenerHead) extListenerHead->prv = newListener; extListenerHead = newListener; if(!extMulticastListener) { extMulticastListener = new ExternalListener(getMulticastAddr(eventName)); } }
int MDSUdpEvent(char *evName, int bufLen, char *buf) { char multiIp[64]; int udpSocket; struct sockaddr_in sin; char *msg, *currPtr; int msgLen, nameLen, actBufLen; int status, error; struct hostent *hp =(struct hostent *) NULL; initialize(); getMulticastAddr(evName, multiIp); udpSocket = getSocket(); #ifdef HAVE_VXWORKS_H bzero((char *)&sin, sizeof(struct sockaddr_in)); sin.sin_family = AF_INET; sin.sin_port = htons( getPort() ); sin.sin_len = (u_char)(sizeof(struct sockaddr_in)); if(((sin.sin_addr.s_addr = inet_addr(multiIp)) == ERROR) && ((sin.sin_addr.s_addr = hostGetByName(multiIp)) == ERROR)) perror("Unknown recipient name in IP address initialization\n"); #else memset((char *)&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; hp = gethostbyname(multiIp); if (hp == NULL) { unsigned int addr = inet_addr(multiIp); if (addr != 0xffffffff) hp = gethostbyaddr((const char *) &addr, (int) sizeof(addr), AF_INET); } if(hp != NULL) memcpy(&sin.sin_addr, hp->h_addr_list[0], hp->h_length); sin.sin_port = htons( getPort() ); #endif nameLen = strlen(evName); if(bufLen < MAX_MSG_LEN - (4 + 4 + nameLen)) actBufLen = bufLen; else actBufLen = MAX_MSG_LEN - (4 + 4 + nameLen); msgLen = 4 + nameLen + 4 + actBufLen; msg = malloc(msgLen); currPtr = msg; *((unsigned int *)currPtr) = htonl(nameLen); currPtr += 4; memcpy(currPtr, evName, nameLen); currPtr += nameLen; *((unsigned int *)currPtr) = htonl(bufLen); currPtr += 4; memcpy(currPtr, buf, bufLen); LockMdsShrMutex(&sendEventMutex,&sendEventMutex_initialized); if(sendto(udpSocket, msg, msgLen, 0, (struct sockaddr *)&sin, sizeof(sin))==-1) { perror("Error sending UDP message!\n"); #ifdef HAVE_WINDOWS_H error = WSAGetLastError(); switch(error) { case WSANOTINITIALISED: printf("WSAENETDOWN\n"); break; case WSAENETDOWN: printf("WSAENETDOWN\n"); break; case WSAEADDRINUSE: printf("WSAEADDRINUSE\n"); break; case WSAEINTR : printf("WSAEINTR\n"); break; case WSAEINPROGRESS: printf("WSAEINPROGRESS\n"); break; case WSAEALREADY: printf("WSAEALREADY\n"); break; case WSAEADDRNOTAVAIL: printf("WSAEADDRNOTAVAIL\n"); break; case WSAEAFNOSUPPORT: printf("WSAEAFNOSUPPORT\n"); break; case WSAECONNREFUSED : printf("WSAECONNREFUSED\n"); break; case WSAEFAULT : printf("WSAEFAULT\n"); break; default: printf("BOH\n"); } #endif status = 0; } else status = 1; UnlockMdsShrMutex(&sendEventMutex); return status; }
int MDSUdpEventAst(char *eventName, void (*astadr)(void *,int,char *), void *astprm, int *eventid) { struct sockaddr_in serverAddr; char flag = 1; int intFlag = 1; int udpSocket; char ipAddress[64]; struct ip_mreq ipMreq; struct EventInfo *currInfo; int error; initialize(); if((udpSocket = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("Error creating socket\n"); return 0; } // serverAddr.sin_len = sizeof(serverAddr); serverAddr.sin_family = AF_INET; #ifdef HAVE_WXWORKS_H serverAddr.sin_len = (u_char)sizeof(struct sockaddr_in); #endif serverAddr.sin_port = htons(getPort()); serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); //Allow multiple connections #ifdef HAVE_WINDOWS_H if(setsockopt(udpSocket, SOL_SOCKET, SO_REUSEADDR, (const char *)&flag, sizeof(char)) == SOCKET_ERROR) #else if(setsockopt(udpSocket, SOL_SOCKET, SO_REUSEADDR, &intFlag, sizeof(int)) < 0) #endif { printf("Cannot set REUSEADDR option\n"); #ifdef HAVE_WINDOWS_H error = WSAGetLastError(); switch(error) { case WSANOTINITIALISED: printf("WSAENETDOWN\n"); break; case WSAENETDOWN: printf("WSAENETDOWN\n"); break; case WSAEADDRINUSE: printf("WSAEADDRINUSE\n"); break; case WSAEINTR : printf("WSAEINTR\n"); break; case WSAEINPROGRESS: printf("WSAEINPROGRESS\n"); break; case WSAEALREADY: printf("WSAEALREADY\n"); break; case WSAEADDRNOTAVAIL: printf("WSAEADDRNOTAVAIL\n"); break; case WSAEAFNOSUPPORT: printf("WSAEAFNOSUPPORT\n"); break; case WSAECONNREFUSED : printf("WSAECONNREFUSED\n"); break; case WSAEFAULT : printf("WSAEFAULT\n"); break; default: printf("BOH\n"); } #else perror("\n"); #endif return 0; } #ifdef HAVE_WINDOWS_H if(bind(udpSocket, (SOCKADDR *)&serverAddr, sizeof(serverAddr)) != 0) #else if(bind(udpSocket, (struct sockaddr *)&serverAddr, sizeof(struct sockaddr_in)) != 0) #endif { perror("Cannot bind socket\n"); return 0; } getMulticastAddr(eventName, ipAddress); ipMreq.imr_multiaddr.s_addr = inet_addr(ipAddress); ipMreq.imr_interface.s_addr = INADDR_ANY; if(setsockopt(udpSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&ipMreq, sizeof(ipMreq)) < 0) { perror("Error setting socket options IP_ADD_MEMBERSHIPin udpStartReceiver\n"); #ifdef HAVE_WINDOWS_H error = WSAGetLastError(); switch(error) { case WSANOTINITIALISED: printf("WSAENETDOWN\n"); break; case WSAENETDOWN: printf("WSAENETDOWN\n"); break; case WSAEADDRINUSE: printf("WSAEADDRINUSE\n"); break; case WSAEINTR : printf("WSAEINTR\n"); break; case WSAEINPROGRESS: printf("WSAEINPROGRESS\n"); break; case WSAEALREADY: printf("WSAEALREADY\n"); break; case WSAEADDRNOTAVAIL: printf("WSAEADDRNOTAVAIL\n"); break; case WSAEAFNOSUPPORT: printf("WSAEAFNOSUPPORT\n"); break; case WSAECONNREFUSED : printf("WSAECONNREFUSED\n"); break; case WSAEFAULT : printf("WSAEFAULT\n"); break; default: printf("BOH\n"); } #endif } currInfo = (struct EventInfo *)malloc(sizeof(struct EventInfo)); currInfo->eventName = malloc(strlen(eventName) + 1); strcpy(currInfo->eventName, eventName); currInfo->socket = udpSocket; currInfo->arg = astprm; currInfo->astadr = astadr; pthread_create(&currInfo->thread, 0, handleMessage, (void *)currInfo); pthread_detach(currInfo->thread); *eventid = getEventId((void *)currInfo); return 1; }