void ClientUdpSocket::onReadPendingDatagram()
{
  while (hasPendingDatagrams()) {
    QByteArray datagram;
    QHostAddress sender;
    quint16 senderPort;
    datagram.resize(pendingDatagramSize());
    readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);

    QDataStream in(datagram);

    quint8 magic = 0;
    in >> magic;
    if (magic != DGMAGICBIT) {
      qDebug() << QString("Datagram with invalid magic byte (size=%1)").arg(datagram.size());
      continue;
    }

    quint8 type;
    in >> type;
    switch (type) {
      case DGHELLO:
        processHello(in, sender, senderPort);
        break;
      case DGDATA:
        processFileData(in, sender, senderPort);
        break;
      default:
        qDebug() << QString("Unknown datagram type");
        break;
    }
  }
}
Exemple #2
0
void* listenerThread(void *arg)
{
  struct sockaddr_in addr;
  int fd, nbytes;
  unsigned int addrlen;
  struct ip_mreq mreq;
  char msgbuf[MSGBUFSIZE];
  u_int yes=1;

  /* create what looks like an ordinary UDP socket */
  if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
    perror("socket");
    return NULL;
  }

  /* allow multiple sockets to use the same PORT number */
  if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0) {
    perror("Reusing ADDR failed");
    return NULL;
  }

  /* set up destination 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_port=htons(INTERCOM_PORT);
     
  /* bind to receive address */
  if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0) {
    perror("bind");
    return NULL;
  }
     
  /* use setsockopt() to request that the kernel join a multicast group */
  mreq.imr_multiaddr.s_addr=inet_addr(INTERCOM_GROUP);
  mreq.imr_interface.s_addr=htonl(INADDR_ANY);
  if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) {
    perror("setsockopt");
    return NULL;
  }

  /* now just enter the read loop */
  while (bRun) {
    char *pt;
    char srcIP[IPSTRSIZE];
    station_diag_t *pOther;

    addrlen=sizeof(addr);
    if ((nbytes=recvfrom(fd,msgbuf,MSGBUFSIZE,0,(struct sockaddr *) &addr,&addrlen)) < 0 ) {
      perror("recvfrom");
      return NULL;
    }

    // Zero terminate the string
    msgbuf[nbytes]=0;

    inet_ntop(AF_INET, &addr.sin_addr, srcIP, sizeof(srcIP));

    if(strcmp( srcIP,myIP)==0) {
      // Ignore our own transmission
      continue;
    }

    pOther = updateDiagData( srcIP, msgbuf, nbytes );

    // Look for version 1.0 header in the message
    // Format as follow: HEADER:CMD
    //   HELO:<IP>
    //   SYNC:<idx>,<state>
    //   EVNT:<idx>,<state>
    pt = msgbuf;
    if(strncmp(pt,HEADER,strlen(HEADER))==0) {
      pt = pt + strlen(HEADER);

      if( strncmp(pt,EVENT_CMD,strlen(EVENT_CMD))==0) {
        pt = pt + strlen(EVENT_CMD);
        if( processEvent( pt ) < 0 )
        {
          // printf( "Malformed CMD: '%s'\n", msgbuf );
          diag.errCnt++;
          if( pOther ) pOther->mlfrmdRxErrCnt++;
        }
      }
      else if( strncmp(pt,HELLO_CMD,strlen(HELLO_CMD))==0) {
        pt = pt + strlen(HELLO_CMD);
        if( processHello( pt ) < 0 )
        {
          // printf( "Malformed HELLO: '%s'\n", msgbuf );
          diag.errCnt++;
          if( pOther ) pOther->mlfrmdRxErrCnt++;
        }
      }
      else if( strncmp(pt,SYNC_CMD,strlen(SYNC_CMD))==0) {
        pt = pt + strlen(SYNC_CMD);
        if( processEvent( pt ) < 0 )
        {
          // printf( "Malformed SYNC: '%s'\n", msgbuf );
          diag.errCnt++;
          if( pOther ) pOther->mlfrmdRxErrCnt++;
        }
      }
      else if( strncmp(pt,RESET_CMD,strlen(RESET_CMD))==0) {
        pt = pt + strlen(RESET_CMD);
        idx = 0;
      }
      else
      {
        diag.errCnt++;
        if( pOther ) pOther->mlfrmdRxErrCnt++;
        // printf( "Unknown command: '%s'\n", msgbuf );
      }
    }
    else
    { 
      diag.errCnt++;
      if( pOther ) pOther->unxpctdRxErrCnt++;
      // printf( "Unknown packet: '%s'\n", msgbuf );
    }
  }
  return NULL;
}
void JRoomModelClientRoomProcessor::process(JSocket* , const QByteArray& data)
{
	QDataStream stream(data);
	JID protocol;
	stream>>protocol;
	switch(protocol){
	case ERP_Hello:
		{
			JCode result;
			stream>>result;
			processHello(result);
		}
		break;
	case ERP_RoomList:
		{
			QList<JRoom> roomlist;
			stream>>roomlist;
			processRoomList(roomlist);
		}
		break;
	case ERP_AddRoom:
		{
			JID roomId;
			stream>>roomId;
			processAddRoom(roomId);
		}
		break;
	case ERP_EnterRoom:
		{
            JID userId;
            JID roomId;
			JCode code;
			stream>>userId;
            stream>>roomId;
			stream>>code;
            processEnterRoom(userId,roomId,code);
		}
		break;
    case ERP_RoomInfo:
		{
			JRoom room;
			stream>>room;
            processRoomInfo(room);
		}
		break;
	case ERP_RoomRemoved:
		{
			JID roomId;
			stream>>roomId;
			processRoomRemoved(roomId);
		}
        break;
    case ERP_RoomChat:
        {
            JID userId;
            JID roomId;
            QString text;
            stream>>userId;
            stream>>roomId;
            stream>>text;
            emit receiveRoomChat(userId,roomId,text);
        }
        break;
	default:
		qDebug()<<"JRoomModelClientRoomProcessor::process : unknown protocol : "<<protocol;
	}
}
Exemple #4
0
int dispatch_msg(const char* p_msg)
{
    log_debug("parsing message: %s", p_msg);
    struct json_object* pobj = json_tokener_parse(p_msg);
    if((NULL == pobj) || (is_error(pobj)))
    {
        log_err("error: message does not appear to be a valid json message: %s", p_msg);
        return(-1);
    }

    // param 0 is the function name
    const char* fcn;
    int rc = get_string_from_array(pobj, 0, &fcn);
    if(0 != rc)
    {
        log_err("error: failed to get function name from message");
        return(-1);
    }

    if(0 == strcmp("pulseRelay", fcn))
    {
        // ["pulseRelay",1,250]
        int num;
        rc = get_int_from_array(pobj, 1, &num);
        if(0 != rc)
        {
            log_err("error: pulseRelay: failed to extract param0 relay num");
            return(-1);
        }
        if((num < 0) || (num > 255))
        {
            log_err("error: pulseRelay: relay num out of range (0-255): [%d]", num);
            return(-1);
        }

        int ms;
        rc = get_int_from_array(pobj, 2, &ms);
        if(0 != rc)
        {
            log_debug("pulseRelay: no cycle ms specified, defaulting to 250ms");
            ms = 250;
        }
        if((ms < 0) || (ms > 255))
        {
            log_err("error: pulseRelay: pulse duration ms out of range (0-255): [%dms]", ms);
            return(-1);
        }

        pulseRelay((uint8_t)num, (uint8_t)ms);
    }

    else if(0 == strcmp("writeOutputRegister", fcn))
    {
        // ["writeOutputRegister",1,255]
        int val;
        rc = get_int_from_array(pobj, 1, &val);
        if(0 != rc)
        {
            log_err("error: writeOutputRegister: failed to extract param0 'value'");
            return(-1);
        }
        if((val < 0) || (val > 255))
        {
            log_err("error: writeOutputRegister: register value out of range (0-255): [%d]", val);
            return(-1);
        }

        int mask;
        rc = get_int_from_array(pobj, 2, &mask);
        if(0 != rc)
        {
            log_err("error: writeOutputRegister: failed to extract param1 'mask'");
            return(-1);
        }
        if((mask < 0) || (mask > 255))
        {
            log_err("error: writeOutputRegister: register mask out of range (0-255): [%d]", mask);
            return(-1);
        }

        writeOutputRegister((uint8_t)val, (uint8_t)mask);
    }

    else if(0 == strcmp("dialModem", fcn))
    {
        // ["dialModem","ATD3,4,4;"]
        const char* val;
        rc = get_string_from_array(pobj, 1, &val);
        if(0 != rc)
        {
            log_err("error: dialModem: failed to extract param0 dial string");
            return(-1);
        }

        dialModem(val);
    }

    else if(0 == strcmp("hello", fcn))
    {
        // ["hello","<device id>"]
        const char* str;
        rc = get_string_from_array(pobj, 1, &str);
        if(0 != rc)
        {
            log_err("error: hello: failed to extract param0 device id");
            return(-1);
        }

        processHello(str);
    }

    else if(0 == strcmp("requestIpv4Addresses", fcn))
    {
        requestIpv4Addresses();
    }

    else
    {
        log_err("error: unknown function: [%s]", fcn);
    }

    return(0);
}