/** 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); }
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; } }
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); } }
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(); }