Пример #1
0
/** Set a Multicast socket */
void setSendSocket(int sock, uint8_t ttl)
{
#ifdef PROXY_MULTICAST
    if (mup.active)
    {
        setNoBlocking(sock);
        return;
    }
#endif

    setScope(sock, ttl);
#if NEEDLOOPBACK
    setLoopback(sock); // loopback
#else
    setNoLoopback(sock); // no loopback (default)
#endif
    setNoBlocking(sock);
}
Пример #2
0
void MiniBeeV2::routeMsg(char type, char *msg, uint8_t size) {
	uint8_t len;
	char * ser;

	if ( loopback ){
	  char * loopbackMsg = (char *)malloc(sizeof(char)* (size + 2 ) );
	  loopbackMsg[0] = type;
	  loopbackMsg[1] = size;
	  for ( i=0; i<size; i++ ){
	      loopbackMsg[i+2] = msg[i];
	  }
	  send( N_INFO, loopbackMsg, size + 2 );
	  free( loopbackMsg );
	}

	switch(type) {
		case S_ANN:
			if ( remoteConfig ){
				sendSerialNumber();
				status = WAITFORHOST;
  // 			send( N_INFO, "waitforhost", 11 );
			}
			break;
		case S_QUIT:
			if ( remoteConfig ){
				status = WAITFORHOST;
			//do something to stop doing anything
			}
// 			send( N_INFO, "waitforhost", 11 );
			break;
		case S_ID:
			if ( remoteConfig ){
			    if ( checkIDMsg( msg[0] ) ){
				len = strlen(serial);
				ser = (char *)malloc(sizeof(char)* (len + 1 ) );
				for(i = 0;i < len;i++)
				    { ser[i] = msg[i+1]; }
				ser[len] = '\0';
				if(strcmp(ser, serial) == 0){
				    node_id = msg[len+1];	//writeConfig(msg);
				    if ( size == (len+3) ){
					config_id = msg[len+2];
					status = WAITFORCONFIG;
					char configInfo[2];
					configInfo[0] = node_id;
					configInfo[1] = config_id;
					send( N_WAIT, configInfo, 2 );
			// 			send( N_INFO, "waitforconfig", 13 );
				    } else if ( size == (len+2) ) {
					readConfig();
					status = SENSING;
			// 				send( N_INFO, "sensing", 7 );
				    }
// 		    		} else {
// // 		    		    send( N_INFO, "wrong serial number", 19 );
// 		    			    send( N_INFO, ser, len );
				}
				free(ser);
			    }
			}
			break;
		case S_CONFIG:
	    if ( remoteConfig ){
			// check if right config_id:
		if ( checkConfMsg( msg[0] ) ){
		    if ( msg[1] == config_id ){
			writeConfig( msg );
			readConfig();
      //                readConfigMsg( msg );
			if ( hasInput ){
			    status = SENSING;
			} else if ( hasOutput ){
			    status = ACTING;
			}
      //                send( N_INFO, "sensing", 7 );
		    }
		}
	    }
	    break;
		case S_RUN:
			if ( checkNodeMsg( msg[0], msg[1] ) ){
			  setRunning( msg[2] );
			}
			break;
		case S_LOOP:
			if ( checkNodeMsg( msg[0], msg[1] ) ){
			  setLoopback( msg[2] );
			}
			break;
		/*
		case S_PWM:
			if ( checkNodeMsg( msg[0], msg[1] ) ){
			    for( i=0; i<6; i++){
			      pwm_values[i] = msg[2+i];
			    }
			    setPWM();
			}
			break;
		case S_DIGI:
			if ( checkNodeMsg( msg[0], msg[1] ) ){
			    for( i=0; i< (size-2); i++){
			      digital_values[i] = msg[2+i];
			    }
			    setDigital();
			}
			break;
		*/
		case S_OUT:
			if ( checkNodeMsg( msg[0], msg[1] ) ){
			  setOutputValues( msg, 2 );
			  setOutput();
			}
			break;
		case S_CUSTOM:
			if ( checkNodeMsg( msg[0], msg[1] ) ){
			    this->customMsgFunc( msg );
			}
			break;
		case N_DATA:
			if ( checkNotNodeMsg( msg[0] ) ){
			    this->dataMsgFunc( msg );
			}
			break;
// 		default:
// 			break;
		}
}
Пример #3
0
main(int argc, char *argv[])
{

	//checking the arguments 
	if (argc != 4 || argc == 2 ) 
	{
		printf("Usage: ChatClient <shost> <sport> <u/m>\n");
		printf("e.g.: ChatClient atria 10123 u \n");
		exit(1);
	}
  	if  ( (hp = gethostbyname(argv[1])) == NULL ) {
    		addr.sin_addr.s_addr = inet_addr(argv[1]);
    		if ((hp = gethostbyaddr((char *) &addr.sin_addr.s_addr,
       		sizeof(addr.sin_addr.s_addr),AF_INET)) == NULL) {
      			fprintf(stderr, "Can't find host %s\n", argv[1]);
      			exit(-1);
    		}
  	}
  	printf("\n>> UMChatServer :\t %s\n", hp->h_name);
  	bcopy ( hp->h_addr, &(server.sin_addr), hp->h_length);
  	printf(">> UMChatServer IP:\t %s \n", inet_ntoa(server.sin_addr));

  	server.sin_family = AF_INET;
  	server.sin_port = htons(atoi(argv[2]));
  	sd = socket (AF_INET,SOCK_STREAM,0);


	if ( connect(sd, (SA *) &server, sizeof(server)) < 0 ) {
    		close(sd);
    		perror("connecting to server socket");
    		exit(0);
	}


	length = sizeof(client);
	if ( getsockname (sd, (SA *)&client,&length) ) {
		perror("getting socket name");
		exit(0);
  	}
    
	TCPPort = ntohs(client.sin_port);
	userName=getlogin();
	
	if(strcmp(argv[3],"m" )== 0)	
	{
		//send logic
		char octet='0';
		
		sprintf(buf, "%c", octet);
		sprintf(userBuf, "%s", userName);
		if (send(sd,userBuf, sizeof(userBuf), 0) <0 )
			perror("sending user name");
		usleep(1000);
		if (send(sd,buf , sizeof(buf), 0) <0 )
			perror("sending MIP message");
			
		
		
	}
	if(strcmp(argv[3],"u" )== 0)	
	{
		//send logic
		char octet='1';
		sprintf(buf, "%c", octet);
		sprintf(userBuf, "%s", userName);
		if (send(sd,userBuf, sizeof(userBuf), 0) <0 )
			perror("sending user name");
			usleep(1000);
		if (send(sd,buf , sizeof(buf), 0) <0 )
			perror("sending MIP message");
		
		
	
	}
	

	printf(">> ChatClient TCP Port:\t %d\n", TCPPort);

	//multicast
	if(strcmp(argv[3],"m" )== 0)
	{
    	if( (rc=recv(sd, MIP, sizeof(MIP), 0)) < 0){
      		perror("receiving MIP  message");
      		exit(-1);
    	}
    	if (rc > 0){
      		MIP[rc]='\0';
      		printf(">> MCAST IP:\t %s", MIP);
    	}

    	if( (rc=recv(sd, MPort, sizeof(MPort), 0)) < 0){
      		perror("receiving MPort  message");
      		exit(-1);
    	}
    	if (rc > 0){
      		MPort[rc]='\0';
      		printf(">> MCAST Port:\t %s\n", MPort);
    	}
		
		if( (rc=recv(sd, listNumber, sizeof(listNumber), 0)) < 0){
      		perror("receiving list  message");
      		exit(-1);
    	}
    	if (rc > 0){
      		listNumber[rc]='\0';
      		printf(">> LIST Code:\t %s\n", listNumber);
    	}
		
		if( (rc=recv(sd, exitNumber, sizeof(exitNumber), 0)) < 0){
      		perror("receiving exit  message");
      		exit(-1);
    	}
    	if (rc > 0){
      		exitNumber[rc]='\0';
      		printf(">> END Code:\t %s\n", exitNumber);
    	}
		//multicast
		
		MulticastIPAddress = MIP;
		UDPPort = htons(atoi( MPort ) );

		LocalHostR.sin_family = AF_INET;
		LocalHostR.sin_port = UDPPort;
		LocalHostR.sin_addr.s_addr = htonl(INADDR_ANY);


		if ((UDPsocketR = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
			printf("can't create UDP socket R: \n");
			exit(-1);
		}
		reusePort(UDPsocketR);

		if (bind(UDPsocketR, (SA *) & LocalHostR, sizeof(LocalHostR)) < 0) {
			printf("error in bind R\n");
			exit(-1);
		}
		
		LocalHostS.sin_family = AF_INET;
		LocalHostS.sin_port =  htons(TCPPort);
		LocalHostS.sin_addr.s_addr = htonl(INADDR_ANY);

		if ((UDPsocketS = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
			printf("can't create UDP socket S: \n");
			exit(-1);
		}

		if (bind(UDPsocketS, (SA *) & LocalHostS, sizeof(LocalHostS)) < 0) {
			printf("error in bind S\n");
			exit(-1);
		}


		TimeToLive = 2;
		setTTLvalue(UDPsocketR, &TimeToLive);

		loop = 1;		/* enable loopback */
		setLoopback(UDPsocketR, loop);

		joinGroup(UDPsocketR, MIP);

			
		signal( SIGQUIT, QUIThandler );

		if (fork() == 0)
		sendMessage(0, UDPsocketS);
		getMessage(UDPsocketR, 1);
		
		
	}
	//unicast
	if(strcmp(argv[3],"u" )== 0)
	{
		if( (rc=recv(sd, MPort, sizeof(MPort), 0)) < 0){
      		perror("receiving MPort  message");
      		exit(-1);
    	}
    	if (rc > 0){
      		MPort[rc]='\0';
      		printf(">> MCAST Port:\t %s\n", MPort);
    	}
		
		if( (rc=recv(sd, listNumber, sizeof(listNumber), 0)) < 0){
      		perror("receiving list  message");
      		exit(-1);
    	}
    	if (rc > 0){
      		listNumber[rc]='\0';
      		printf(">> LIST Code:\t %s\n", listNumber);
    	}
		
		if( (rc=recv(sd, exitNumber, sizeof(exitNumber), 0)) < 0){
      		perror("receiving exit  message");
      		exit(-1);
    	}
    	if (rc > 0){
      		exitNumber[rc]='\0';
      		printf(">> END Code:\t %s\n", exitNumber);
    	}
		//creates udp socket
		UDPPort = htons(atoi( MPort ) );
		
		LocalHostS.sin_family = AF_INET;
		LocalHostS.sin_port =UDPPort;
		LocalHostS.sin_addr.s_addr = htonl(INADDR_ANY);

		if ((UDPsocketS = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
			printf("can't create UDP socket S: \n");
			exit(-1);
		}

		if (bind(UDPsocketS, (SA *) & LocalHostS, sizeof(LocalHostS)) < 0) {
			printf("error in bind S\n");
			exit(-1);
		}
		
		
		if (fork() == 0)
		sendMessage(0, UDPsocketS);
		getMessage(UDPsocketS, 1);
		
	}
	
}
Пример #4
0
main(int argc, char *argv[])
{
	FD_SET(0, &full_fd);    
	
	if (argc != 4) {
		printf("Usage: ChatClient <host> <port> <m|u|s>\n");
		printf("e.g.: ChatClient atria 10123 u \n");
		exit(1);
	}

        if ((username = getlogin()) == NULL) perror("Who are you?\n");

  	if  ( (hp = gethostbyname(argv[1])) == NULL ) {
    		addr.sin_addr.s_addr = inet_addr(argv[1]);
    		if ((hp = gethostbyaddr((char *) &addr.sin_addr.s_addr,
       		sizeof(addr.sin_addr.s_addr),AF_INET)) == NULL) {
      			fprintf(stderr, "Can't find host %s\n", argv[1]);
      			exit(-1);
    		}
  	}
  	printf("\n UMChatServer --> %s\n", hp->h_name);

  	bcopy ( hp->h_addr, &(TCPserver.sin_addr), hp->h_length);
  	bcopy ( hp->h_addr, &(UDPserver.sin_addr), hp->h_length);
	bcopy ( hp->h_addr, &(SCTP_Qserver.sin_addr), hp->h_length);
  	printf(" UMChatServer IP: %s \n", inet_ntoa(TCPserver.sin_addr));

	SCTP_Qserver.sin_family = AF_INET; 
  	TCPserver.sin_family = AF_INET;
  	UDPserver.sin_family = AF_INET;
  	TCPserver.sin_port = htons(atoi(argv[2]));

	
        if (strcmp(argv[3], "s") == 0) TYPE=S;
        if (strcmp(argv[3], "m") == 0) TYPE=M;
		if (strcmp(argv[3], "u") == 0) TYPE=U;	    

if (TYPE == S)	    
{
	SCTPsocket = socket (AF_INET,SOCK_STREAM,IPPROTO_SCTP);	
	
		if ( connect(SCTPsocket, (SA *) &TCPserver, sizeof(TCPserver)) < 0 ) {
				close(SCTPsocket);
				perror("connecting to UMChatServer socket");
				exit(0);
		}

			if ( send(SCTPsocket, username, strlen(username), 0) < 0) 
				perror("send username message");

		length = sizeof(client);
		if ( getsockname (SCTPsocket, (SA *)&client,&length) ) {
			perror("getting socket name");
			exit(0);
		}
			SCTPPort = ntohs(client.sin_port);	
}
else    
	{
		TCP_socket = socket (AF_INET,SOCK_STREAM,0);
		if ( connect(TCP_socket, (SA *) &TCPserver, sizeof(TCPserver)) < 0 ) {
				close(TCP_socket);
				perror("connecting to UMChatServer socket.....");
				exit(0);
		}

			if ( send(TCP_socket, username, strlen(username), 0) < 0) 
				perror("send username message");

		length = sizeof(client);
		if ( getsockname (TCP_socket, (SA *)&client,&length) ) {
			perror("getting socket name");
			exit(0);
		}
			TCPPort = ntohs(client.sin_port);
	}


	if (TYPE == M) 
	{
       		if ( send(TCP_socket, MChat, strlen(MChat), 0) < 0) 
			perror("send MChat  message");
	        if( (rc=recv(TCP_socket, MIP, sizeof(MIP), 0)) < 0) 
			perror("receiving MIP  message");
        	if (rc > 0)
			{
               		MIP[rc]='\0';
                	printf("THE MCAST IP --> %s", MIP);
        	}
    }
	if (TYPE == U)     
	{
		if ( send(TCP_socket, UChat, strlen(UChat), 0) < 0)  
			perror("send UChat  message");
    }
	if (TYPE == S)    
	{
		if( (rc=recv(SCTPsocket, MPort, sizeof(MPort), 0)) < 0) 	
			perror("receiving MPort message 01");
		if (rc > 0)
		{
			MPort[rc]='\0';
			printf(" THE MCAST Port --> %s\n", MPort);
		}
			strcat(record,inet_ntoa(SCTP_Qserver.sin_addr));
		strcat(record,":");
		strcat(record,MPort);
			sprintf(ServerAddr, "[%s] ", record);
		UDPPort = htons(atoi( MPort ) );
		SCTP_Qserver.sin_port = UDPPort;

			if( (rc=recv(SCTPsocket, RandomCODE1, sizeof(RandomCODE1), 0)) < 0) 
			perror("receiving RandomCODE1  message");
			if (rc > 0){
				RandomCODE1[rc]='\0';
				printf(" THE LIST Code --> %s\n", RandomCODE1);
			}

			if( (rc=recv(SCTPsocket, RandomCODE2, sizeof(RandomCODE2), 0)) < 0) 
			perror("receiving RandomCODE2  message");
			if (rc > 0){
				RandomCODE2[rc]='\0';
				printf("THE END Code --> %s\n\n", RandomCODE2);
			}		
	}
	else    
	{
		if( (rc=recv(TCP_socket, MPort, sizeof(MPort), 0)) < 0) 	
			perror("receiving MPort  message");
		if (rc > 0)
		{ 
			MPort[rc]='\0';
			printf(" THE MCAST Port --> %s\n", MPort);
		}
			strcat(record,inet_ntoa(UDPserver.sin_addr));
		strcat(record,":");
		strcat(record,MPort);
			sprintf(ServerAddr, "[%s] ", record);
		UDPPort = htons(atoi( MPort ) );
		UDPserver.sin_port = UDPPort;

			if( (rc=recv(TCP_socket, RandomCODE1, sizeof(RandomCODE1), 0)) < 0) 
			perror("receiving RandomCODE1  message");
			if (rc > 0){
				RandomCODE1[rc]='\0';
				printf(" THE LIST Code --> %s\n", RandomCODE1);
			}

			if( (rc=recv(TCP_socket, RandomCODE2, sizeof(RandomCODE2), 0)) < 0) 
			perror("receiving RandomCODE2  message");
			if (rc > 0){
				RandomCODE2[rc]='\0';
				printf(" THE END Code --> %s\n\n", RandomCODE2);
			}
	}
		
	LocalHostUS.sin_family = AF_INET;
	LocalHostUS.sin_port =  htons(TCPPort);
	LocalHostUS.sin_addr.s_addr = htonl(INADDR_ANY);
	
	    
	LocalHostSCTP_Q.sin_family = AF_INET;
	LocalHostSCTP_Q.sin_port =  htons(client.sin_port)+1;
	LocalHostSCTP_Q.sin_addr.s_addr = htonl(INADDR_ANY);	

		    
        MulticastIPAddress = MIP;
        UDPPort = htons(atoi( MPort ) );
        LocalHostUR.sin_family = AF_INET;
        LocalHostUR.sin_port = UDPPort;
        LocalHostUR.sin_addr.s_addr = htonl(INADDR_ANY);

        GroupAddress.sin_family = AF_INET;
        GroupAddress.sin_port = UDPPort;
        GroupAddress.sin_addr.s_addr = inet_addr(MulticastIPAddress);

	if ((UDPsocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
		perror("can't create UDP socket S: \n");
	if (bind(UDPsocket, (SA *) & LocalHostUS, sizeof(LocalHostUS)) < 0) printf("error in bind UDP S\n");
	
	FD_SET(UDPsocket, &full_fd);
	
	    
	if ((SCTP_Qsocket = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)) < 0) 
		perror("can't create SCTP-Q socket S: \n");
		
	reusePort(SCTP_Qsocket);		
	
	if (bind(SCTP_Qsocket, (SA *) & LocalHostSCTP_Q, sizeof(LocalHostSCTP_Q)) < 0) printf("error in bind SCTP_Q S\n");
	
	FD_SET(SCTP_Qsocket, &full_fd);
	
	
	if (TYPE == M) {
        	if ((MCASTsocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
			perror("can't create UDP MCASTsocket R: \n");
        	reusePort(MCASTsocket);
        	if (bind(MCASTsocket, (SA *) & LocalHostUR, sizeof(LocalHostUR)) < 0)  
			perror("error in bind R\n");
        	joinGroup(MCASTsocket, MIP);
			
			FD_SET(MCASTsocket, &full_fd); 
	}
        TimeToLive = 2;
        setTTLvalue(UDPsocket, &TimeToLive);
        loop = 1;               
        setLoopback(UDPsocket, loop);
	 

	signal( SIGQUIT, QUIThandler );
	signal( SIGINT, INThandler);
	

        char            recvBuf[MAXLINE];
        int             bytes = 0;

        if (TYPE == U) {
		if (sendto(UDPsocket,EchoTest,strlen(EchoTest),0,(SA *)&UDPserver,sizeof(UDPserver)) < 0) 
			perror("error in sendto EchoTest UDPsocket \n");
	}
	
	    
        if (TYPE == S) {
		char EchoTest[100];
		strcpy(EchoTest,"WELCOME, New SCTP: ");
		
		strcat(EchoTest,username);
		strcat(EchoTest,"\n");
		
		
		if (sendto(SCTP_Qsocket,EchoTest,strlen(EchoTest),0,(SA *)&SCTP_Qserver,sizeof(SCTP_Qserver)) < 0) 
			perror("error in send to EchoTest SCTP_Qsocket \n");
	}	
        if (TYPE == M) {
		 if (sendto(UDPsocket,EchoTest,strlen(EchoTest),0,(SA *)&UDPserver,sizeof(UDPserver)) < 0) 
			 perror("error in send to EchoTest UDPsocket \n");
		if (sendto(MCASTsocket,EchoTest,strlen(EchoTest),0,(SA *)&UDPserver,sizeof(UDPserver)) < 0) 
			perror("error in send to EchoTest MCASTsocket \n");
                 if ( (bytes = recvfrom(UDPsocket, recvBuf, MAXLINE, 0, (SA *) &from, &fromlen) ) < 0)   
			 perror("error in rec from EchoTest UDPsocket \n");
	
	}	
	        sleep(1);
	
	selectHandle();
}