Пример #1
0
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;
}
Пример #2
0
	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));
		}

	}
Пример #3
0
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;
}
Пример #4
0
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;
}