Exemple #1
1
int main(int argc, char **argv)
{
	int sockfd, new_fd,numbytes;  // listen on sock_fd, new connection on new_fd
	char buf[MAXDATASIZE];
    struct addrinfo hints, *servinfo, *p;
	struct sockaddr_storage their_addr; // connector's address information
	socklen_t sin_size;
	struct sigaction sa;
	int yes=1;
	char s[INET6_ADDRSTRLEN];
	int rv,tempType=0;
    pid_t tempPid;
    PACKET tempPacket;
    
    if (argc==2 && (strcmp("-d",argv[1])==0)) {
        printf("== Daemon mode selected.==\n");
        
        daemonFlag=1;
        
    }
    
    if (daemonFlag) {

    
     // Become a daemon:
     switch (fork ())
     {
     case -1:                    // can't fork 
             perror ("fork()");
             exit (0);
     case 0:                     // child, process becomes a daemon:
             close (STDIN_FILENO);
             close (STDOUT_FILENO);
             close (STDERR_FILENO);
             if (setsid () == -1)      // request a new session (job control)
             {
                 exit (0);
             }
             break;
     default:                    // parent returns to calling process: 
             return 0;
     }
     
     // Establish signal handler to clean up before termination:
     if (signal (SIGTERM, termination_handler) == SIG_IGN)
     signal (SIGTERM, SIG_IGN);
     signal (SIGINT, SIG_IGN);
     signal (SIGHUP, SIG_IGN);
     
    }
    
	memset(&hints, 0, sizeof hints);
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_flags = AI_PASSIVE; // use my IP

	if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) {
		fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
		return 1;
	}
    


	// loop through all the results and bind to the first we can
	for(p = servinfo; p != NULL; p = p->ai_next) {
		if ((sockfd = socket(p->ai_family, p->ai_socktype,
				p->ai_protocol)) == -1) {
			perror("server: socket");
			continue;
		}

		if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,
				sizeof(int)) == -1) {
			perror("setsockopt");
			exit(1);
		}

		if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
			close(sockfd);
			perror("server: bind");
			continue;
		}

		break;
	}

	if (p == NULL)  {
		fprintf(stderr, "server: failed to bind\n");
		return 2;
	}

	freeaddrinfo(servinfo); // all done with this structure

	if (listen(sockfd, BACKLOG) == -1) {
		perror("listen");
		exit(1);
	}

	sa.sa_handler = sigchld_handler; // reap all dead processes
	sigemptyset(&sa.sa_mask);
	sa.sa_flags = SA_RESTART;
	if (sigaction(SIGCHLD, &sa, NULL) == -1) {
		perror("sigaction");
		exit(1);
	}

    
    printf("server(%d): waiting for connections...\n",getpid());
    
	while(keep_going) 
    {  // main accept() loop
		sin_size = sizeof their_addr;
		new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
		if (new_fd == -1) {
			perror("accept");
			continue;
		}

		inet_ntop(their_addr.ss_family,
			get_in_addr((struct sockaddr *)&their_addr),
			s, sizeof s);
		printf("server(%d): got connection from %s\n", getpid(),s);

		if (!fork()) { // this is the child process
    
            close(sockfd); // child doesn't need this descriptor
            openlog("DaemonServer",LOG_PID,LOG_SYSLOG);
            
            while (tempType!=2) {//child stops when client deregisters
                
                
                //recv packet
                
                if (recv(new_fd, (void*)&tempPacket, 
                                     sizeof(tempPacket), 0) == -1) {
                    perror("recv");
                    break;
                }
            
                tempType=tempPacket.packet_head.type;
                tempPid=tempPacket.packet_head.sender_pid;
                
                if (tempType<=3) {
                    
                printf("server(%d): received msg type:'%d' from %s-client(%d) \n",getpid(),
                       tempType,tempPacket.packet_head.mid,tempPid);
                    
                    syslog(LOG_NOTICE, "server(%d): received msg type:'%d' from %s-client(%d) \n",getpid(),
                           tempType,tempPacket.packet_head.mid,tempPid);
                   
                if (tempType==MSG_HEAD_NORMAL) {
                    
                    printf("server(%d): received following msg string from %s-client(%d): %s \n",getpid(),tempPacket.packet_head.mid,tempPid,tempPacket.packet_body.charbody);
                    
                    syslog(LOG_NOTICE, "server(%d): received following msg string from %s-client(%d): %s \n",getpid(),tempPacket.packet_head.mid,tempPid,tempPacket.packet_body.charbody);
                }
                    
                //generate ACKs
                    printf("server(%d): sent ACK type:'%d' to %s-client(%d)\n",getpid(),
                           tempType+3,tempPacket.packet_head.mid,tempPid);
                    syslog(LOG_NOTICE, "server(%d): received following msg string from %s-client(%d): %s \n",getpid(),tempPacket.packet_head.mid,tempPid,tempPacket.packet_body.charbody);
                    generatePacket(&tempPacket, tempType+3, getpid(), "Server");
                
                //send acks
                if (send(new_fd, (void*)&tempPacket, sizeof(tempPacket), 0) == -1) {
                    
                        perror("send");
                        break;
                }
            
                }
            }
            
            closelog();
			close(new_fd);
			exit(0);
		}
		close(new_fd);  // parent doesn't need this
	}

	return 0;
}
Exemple #2
0
int main(int argc, char *argv[])
{
  int sockfd;
  struct sockaddr_in theiraddr;
  struct hostent *he;
  uint8_t mac[6] = {0, 0, 0, 0, 0, 0};
  uint8_t packet[102] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  int broadcast = 1;

  if (argc != 3)
  {
    fprintf(stderr, "Usage: %s <host> <mac>\n", argv[0]);
    exit(1);
  }
  
  if ((he = gethostbyname(argv[1])) == NULL)
  {
    perror("gethostbyname");
    exit(1);
  }

  if ((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) == -1)
  {
    perror("socket");
    exit(1);
  }

  if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)) == -1)
  {
    perror("setsockopt (SO_BROADCAST)");
    exit(1);
  }

  memset(&theiraddr, 0, sizeof(theiraddr));
  theiraddr.sin_family = PF_INET;
  theiraddr.sin_port = htons(PORT);
  theiraddr.sin_addr = *((struct in_addr *) he->h_addr);

  sscanf(argv[2], "%02"SCNx8":%02"SCNx8":%02"SCNx8":%02"SCNx8":%02"SCNx8":%02"SCNx8, &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);

  generatePacket(mac, packet);

  if ((sendto(sockfd, packet, sizeof(packet), 0, (struct sockaddr *)&theiraddr, sizeof(struct sockaddr))) == -1)
  {
    perror("sendto");
    exit(1);
  }

  printf("Sent a wakeup call to %s.\n", inet_ntoa(theiraddr.sin_addr));

  close(sockfd);
  return 0;
}
Exemple #3
0
void SSLWorld::sendVisionBuffer()
{
    int t = timer->elapsed();
    sendQueue.push_back(new SendingPacket(generatePacket(),t));
    while (t - sendQueue.front()->t>=cfg->sendDelay())
    {
        SSL_WrapperPacket *packet = sendQueue.front()->packet;
        delete sendQueue.front();
        sendQueue.pop_front();
        visionServer->send(*packet);
        delete packet;
        if (sendQueue.isEmpty()) break;
    }
}
DS2Packet& DS2Packet::setData(const uint8_t* data, uint16_t length)
{
	if(length)
	{
		delete[] dataPtr;
		dataPtr = new uint8_t[length];
		memcpy(dataPtr, data, length);
	}

	this->dataLength = length;

	if(type == DS2_8BIT)
		this->packetLength = length + 3;
	else if(type == DS2_16BIT)
		this->packetLength = length + 4;
	else
		throw;

	generatePacket();
	return *this;
}
Exemple #5
0
//数据段转为data
_xai_packet* generatePacketFromParamDataList(_xai_packet_param_data* ctrl_param_data , int count){
    
    _xai_packet*  packet = generatePacket();
    
    void* data_load = malloc(1000);
    memset(data_load, 0, 1000);
    
    int  dataPos = 0;
    
    for (int i = 0; i < count; i++) {
        
        _xai_packet_param_data* ctrl_data = paramDataAtIndex(ctrl_param_data, i);
        if (NULL ==  ctrl_data) {
            
            free(data_load);
            purgePacket(packet);
            
            printf("CTRL  DATA NULL");
            //abort();
            return NULL;
        }
        
        _xai_packet*  ctrl_data_packet = generatePacketFromeDataOne(ctrl_data);
        
        memcpy(data_load + dataPos, ctrl_data_packet->all_load, ctrl_data_packet->size);
        
        dataPos += ctrl_data_packet->size;
        
        purgePacket(ctrl_data_packet);
    }
    
    
    packet->all_load = data_load;
    packet->size = dataPos;
    
    return packet;
    
}
Exemple #6
0
_xai_packet* generatePacketFromeDataOne(_xai_packet_param_data* ctrl_param_data){
    
    
    if (ctrl_param_data == NULL) return NULL;
    
    
    _xai_packet* ctrl_data = generatePacket();
    
    
    char*  payload  = malloc(1000);
    memset(payload,0,1000);
    
    if(!payload) return NULL;
    
    //big
    uint16_t big_len = CFSwapInt16(ctrl_param_data->data_len);
    
    //存入固定格式
    param_to_packet_helper(payload, &ctrl_param_data->data_type, _XPP_CD_TYPE_START, _XPP_CD_TYPE_END);
    param_to_packet_helper(payload, &big_len, _XPP_CD_LEN_START, _XPP_CD_LEN_END);
    
    ctrl_data->pre_load = malloc(_XPPS_CD_FIXED_ALL);
    memcpy(ctrl_data->pre_load, payload, _XPPS_CD_FIXED_ALL);
    
    int pos =  _XPPS_CD_FIXED_ALL;
    
    if (NULL != ctrl_param_data->data) {
        
        
        /*type  大端 小端转化*/
        
        void* in_data =  malloc(ctrl_param_data->data_len);
        memset(in_data, 0, ctrl_param_data->data_len);
        memcpy(in_data, ctrl_param_data->data, ctrl_param_data->data_len);
        
        
        if (XAI_DATA_TYPE_BIN_DIGITAL_UNSIGN == ctrl_param_data->data_type) {
            
            
            SwapBytes(in_data, ctrl_param_data->data_len);
            
        }
        if (XAI_DATA_TYPE_BIN_APSN == ctrl_param_data->data_type) {
            
            
            SwapBytes(in_data, ctrl_param_data->data_len);
            
        }
        if (XAI_DATA_TYPE_BIN_LUID == ctrl_param_data->data_type) {
            
            
            SwapBytes(in_data, ctrl_param_data->data_len);
            
        }
        
        
        
        ctrl_data->data_load = malloc(ctrl_param_data->data_len);
        memset(ctrl_data->data_load, 0, ctrl_param_data->data_len);
        memcpy(ctrl_data->data_load, in_data, ctrl_param_data->data_len);
        
        //param_to_packet_helper(payload, in_data, 0 , 0 + ctrl_param_data->data_len);
        
        memcpy(payload+pos, in_data, ctrl_param_data->data_len);
        
        pos +=  ctrl_param_data->data_len;

        free(in_data);
        in_data = NULL;

        
    }else{
        
        ctrl_data->data_load = NULL;
    }
    
    
    
    ctrl_data->all_load = malloc(pos);
    memcpy(ctrl_data->all_load, payload, pos);
    
    ctrl_data->size = pos;
    
    free(payload);
    
    
    return ctrl_data;
    
    
}
Exemple #7
0
int main(int argc, char *argv[])
{
	int sockfd, numbytes;  
	char buf[MAXDATASIZE];
	struct addrinfo hints, *servinfo, *p;
	int rv;
	char s[INET6_ADDRSTRLEN];
    PACKET tempPacket;

	if (argc != 3) {
	    fprintf(stderr,"usage: client [hostname] [mnemonic name]\n");
	    exit(1);
	}

	memset(&hints, 0, sizeof hints);
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;

	if ((rv = getaddrinfo(argv[1], PORT, &hints, &servinfo)) != 0) {
		fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
		return 1;
	}

	// loop through all the results and connect to the first we can
	for(p = servinfo; p != NULL; p = p->ai_next) {
		if ((sockfd = socket(p->ai_family, p->ai_socktype,
				p->ai_protocol)) == -1) {
			perror("client: socket");
			continue;
		}

		if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
			close(sockfd);
			perror("client: connect");
			continue;
		}

		break;
	}

	if (p == NULL) {
		fprintf(stderr, "client: failed to connect\n");
		return 2;
	}

	inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr),
			s, sizeof s);
	printf("client: connecting to %s\n", s);

	freeaddrinfo(servinfo); // all done with this structure

    
    //send reg
    generatePacket(&tempPacket, MSG_HEAD_REG, getpid(), argv[2]);
    
    if (send(sockfd, (void*)&tempPacket, sizeof(tempPacket), 0) == -1)
        perror("send");
    
    
    //recv reg_ack
	if ((numbytes = recv(sockfd, (void*)&tempPacket, sizeof(tempPacket), 0)) == -1) {
	    perror("recv");
	    exit(1);
	}


    if (tempPacket.packet_head.type==MSG_HEAD_REG_ACK) {
        
    
	printf("client(%d): received ACK for reg from server(%d)\n",getpid(),tempPacket.packet_head.sender_pid);
    }
    printf("Press any key to send msg: 'Hello Server!'");
    getchar();
    //Send msg
    generatePacket(&tempPacket, MSG_HEAD_NORMAL, getpid(), argv[2]);
    addMsg(&tempPacket,"Hello Server!");
    if (send(sockfd, (void*)&tempPacket, sizeof(tempPacket), 0) == -1)
        perror("send");

    //recv msg_ack
	if ((numbytes = recv(sockfd, (void*)&tempPacket, sizeof(tempPacket), 0)) == -1) {
	    perror("recv");
	    exit(1);
	}
    
    
    if (tempPacket.packet_head.type==MSG_HEAD_NORMAL_ACK) {
        
        
        printf("client(%d): received ACK for msg from server(%d)\n",getpid(),tempPacket.packet_head.sender_pid);
    }
    printf("Press any key to deregister.");
    getchar();
    
    //send dereg
    generatePacket(&tempPacket, MSG_HEAD_DEREG, getpid(), argv[2]);
    
    if (send(sockfd, (void*)&tempPacket, sizeof(tempPacket), 0) == -1)
        perror("send");
    
    
    //recv dereg_ack
	if ((numbytes = recv(sockfd, (void*)&tempPacket, sizeof(tempPacket), 0)) == -1) {
	    perror("recv");
	    exit(1);
	}
    
    
    if (tempPacket.packet_head.type==MSG_HEAD_DEREG_ACK) {
        
        
        printf("client(%d): received ACK for dereg  from server(%d)\n",getpid(),tempPacket.packet_head.sender_pid);
    }


	close(sockfd);

	return 0;
}
Exemple #8
0
void SimThread::run()
{
	init = true;
	currentLocationPacket=0;
	currentLocationInfoPacket=0;
	QFile logfile(m_filename);
	if (!logfile.open(QIODevice::ReadOnly))
	{
		qDebug() << "Unable to open file. Exiting sim thread";
		return;
	}
	QByteArray logbytes = logfile.readAll();
	nextPacketIsLocation = false;

	QByteArray qbuffer;
	QList<QByteArray> m_queuedMessages;
	QString byteoutofpacket;
	bool m_inpacket = false;
	bool m_inescape = false;
	for (int i=0;i<logbytes.size();i++)
	{
		if ((unsigned char)logbytes[i] == 0xAA)
		{
			if (m_inpacket)
			{
				//Start byte in the middle of a packet
				//Clear out the buffer and start fresh
				m_inescape = false;
				qbuffer.clear();
			}
			//qbuffer.append(buffer[i]);
			//qDebug() << "Start of packet";
			//Start of packet
			m_inpacket = true;
		}
		else if ((unsigned char)logbytes[i] == 0xCC && m_inpacket)
		{
			//qDebug() << "End of packet. Size:" << qbuffer.size();
			//End of packet
			m_inpacket = false;
			//qbuffer.append(buffer[i]);

			//m_logFile->flush();
			//emit parseBuffer(qbuffer);


			//New Location of checksum
			unsigned char sum = 0;
			for (int i=0;i<qbuffer.size()-1;i++)
			{
				sum += qbuffer[i];
			}
			//qDebug() << "Payload sum:" << QString::number(sum);
			//qDebug() << "Checksum sum:" << QString::number((unsigned char)currPacket[currPacket.length()-1]);
			if (sum != (unsigned char)qbuffer[qbuffer.size()-1])
			{
				qDebug() << "BAD CHECKSUM!";
				//return QPair<QByteArray,QByteArray>();
			}
			else
			{
				m_queuedMessages.append(qbuffer.mid(0,qbuffer.length()-1));
			}
			//return qbuffer;
			QString output;
			for (int i=0;i<qbuffer.size();i++)
			{
				int num = (unsigned char)qbuffer[i];
				output.append(" ").append((num < 0xF) ? "0" : "").append(QString::number(num,16));
			}
			//qDebug() << "Full packet:";
			//qDebug() << output;
			qbuffer.clear();
		}
		else
		{
			if (m_inpacket && !m_inescape)
			{
				if ((unsigned char)logbytes[i] == 0xBB)
				{
					//Need to escape the next byte
					//retval = logfile.read(1);
					m_inescape = true;
				}
				else
				{
					qbuffer.append(logbytes[i]);
				}

			}
			else if (m_inpacket && m_inescape)
			{
				if ((unsigned char)logbytes[i] == 0x55)
				{
					qbuffer.append((char)0xAA);
				}
				else if ((unsigned char)logbytes[i] == 0x44)
				{
					qbuffer.append((char)0xBB);
				}
				else if ((unsigned char)logbytes[i] == 0x33)
				{
					qbuffer.append((char)0xCC);
				}
				else
				{
					qDebug() << "Error, escaped character is not valid!:" << QString::number(logbytes[i],16);
				}
				m_inescape = false;
			}
			else
			{
				//qDebug() << "Byte out of a packet:" << QString::number(buffer[i],16);
				byteoutofpacket += QString::number(logbytes[i],16) + " ";
			}
		}
	}
	//qDebug() << "Bytes out of a packet:" << byteoutofpacket;


	//Done.
	qDebug() << m_queuedMessages.size() << "Messages read in";
	for (int i=0;i<m_queuedMessages.size();i++)
	{
		Packet parsedPacket = parseBuffer(m_queuedMessages[i]);
		packetList.append(parsedPacket);
		//parsePacket(parsedPacket);
	}
	int fd=0;
#ifdef HAVE_POSIX_OPENPT
		fd = posix_openpt(O_RDWR | O_NOCTTY);
#else
		fd = open("/dev/ptmx",O_RDWR | O_NOCTTY);
#endif //HAVE_POSIX_OPENPT

		if(-1 == fd) {
#ifdef HAVE_POSIX_OPENPT
			perror("Error in posix_openpt");
#else
			perror("Error opening /dev/ptmx");
#endif //HAVE_POSIX_OPENPT
			return;
		}
		grantpt(fd);
		unlockpt(fd);

		struct termios oldtio;
		if(0 != tcgetattr(fd,&oldtio)) {
			perror("tcgetattr openpt warning");
		}
		//bzero(&newtio,sizeof(newtio));

		oldtio.c_cflag = CS8 | CLOCAL | CREAD; // CBAUD
		oldtio.c_iflag = IGNPAR | ICRNL;
		oldtio.c_oflag = 0;
		oldtio.c_lflag = ICANON & (~ECHO);

		oldtio.c_cc[VEOL]     = '\r';
		// oldtio.c_cc[VEOL2]    = 0;     /* '\0' */

		tcflush(fd,TCIFLUSH);
		if(0 != tcsetattr(fd,TCSANOW,&oldtio)) {
			perror("tcsetattr warning");
		}

#ifdef HAVE_PTSNAME_R
		if(0 != ptsname_r(fd, portname, sizeof(portname))) {
			perror("Couldn't get pty slave name");
		}
#else
		char *ptsname_val = ptsname(fd);
		if(NULL == ptsname_val) {
			perror("Couldn't get pty slave name");
		}
		QString portname = QString(ptsname_val);
		//strncpy(portname, ptsname_val, sizeof(portname));
#endif //HAVE_PTSNAME_R


	fcntl(fd,F_SETFL,O_NONBLOCK); // O_NONBLOCK + fdopen/stdio == bad

	qDebug() << "Port:" << portname << "opened for sim!";
	unsigned char buffer[1024];
	unsigned short nextlocationid;
	bool nextislocation = false;
	init = false;
	while (true)
	{
		int readlen = read(fd,buffer,1024);
		if (readlen < 0)
		{
			//Nothing on the port
			usleep(10000);
		}
		if (readlen == 0)
		{
			usleep(10000);
		}
		for (int i=0;i<readlen;i++)
		{
			if (buffer[i] == 0xAA)
			{
				if (m_inpacket)
				{
					//Start byte in the middle of a packet
					//Clear out the buffer and start fresh
					m_inescape = false;
					qbuffer.clear();
				}
				//qbuffer.append(buffer[i]);
				//qDebug() << "Start of packet";
				//Start of packet
				m_inpacket = true;
			}
			else if (buffer[i] == 0xCC && m_inpacket)
			{
				//qDebug() << "End of packet. Size:" << qbuffer.size();
				//End of packet
				m_inpacket = false;
				//qbuffer.append(buffer[i]);

				//m_logFile->flush();
				//emit parseBuffer(qbuffer);


				//New Location of checksum
				unsigned char sum = 0;
				for (int i=0;i<qbuffer.size()-1;i++)
				{
					sum += qbuffer[i];
				}
				//qDebug() << "Payload sum:" << QString::number(sum);
				//qDebug() << "Checksum sum:" << QString::number((unsigned char)currPacket[currPacket.length()-1]);
				if (sum != (unsigned char)qbuffer[qbuffer.size()-1])
				{
					qDebug() << "BAD CHECKSUM!";
					//return QPair<QByteArray,QByteArray>();
				}
				else
				{
					QByteArray fullmsg = qbuffer.mid(0,qbuffer.length()-1);
					Packet p = parseBuffer(fullmsg);
					if (p.payloadid == 0x0104 || p.payloadid == 0x0106)
					{
						Packet p2 = locationidList[currentLocationPacket++];
						QByteArray tosend = generatePacket(p2.header,p2.payload);
						write(fd,tosend.data(),tosend.length());
					}
					else if (p.payloadid == 0xF8E0)
					{
						Packet p2 = locationidInfoList[currentLocationInfoPacket++];
						QByteArray tosend = generatePacket(p2.header,p2.payload);
						write(fd,tosend.data(),tosend.length());

					}
					/*if (p.payloadid == 0x0106 || p.payloadid == 0x0108)
					{
						//Request for ram.
						if (nextislocation)
						{
							nextislocation = false;
							unsigned short lookforpayload = p.payloadid+1;
							for (int i=0;i<packetList.size();i++)
							{
								if (packetList[i].payloadid == lookforpayload)
								{
									unsigned short tmp = (((unsigned char)p.payload[0]) << 8) + (unsigned char)p.payload[1];
									//if (tmp == nextlocationid)
									//{
										QByteArray tosend = generatePacket(packetList[i].header,packetList[i].payload);
										write(fd,tosend.data(),tosend.length());
										break;
									//}
								}
							}
						}
					}*/
					else
					{
						unsigned short lookforpayload = p.payloadid+1;
						for (int i=0;i<packetList.size();i++)
						{
							if (packetList[i].payloadid == lookforpayload)
							{
								QByteArray tosend = generatePacket(packetList[i].header,packetList[i].payload);
								write(fd,tosend.data(),tosend.length());
								break;
							}
						}
					}

				}
				//return qbuffer;
				QString output;
				for (int i=0;i<qbuffer.size();i++)
				{
					int num = (unsigned char)qbuffer[i];
					output.append(" ").append((num < 0xF) ? "0" : "").append(QString::number(num,16));
				}
				//qDebug() << "Full packet:";
				//qDebug() << output;
				qbuffer.clear();
			}
			else
			{
				if (m_inpacket && !m_inescape)
				{
					if (buffer[i] == 0xBB)
					{
						//Need to escape the next byte
						//retval = logfile.read(1);
						m_inescape = true;
					}
					else
					{
						qbuffer.append(buffer[i]);
					}

				}
				else if (m_inpacket && m_inescape)
				{
					if (buffer[i] == 0x55)
					{
						qbuffer.append((char)0xAA);
					}
					else if (buffer[i] == 0x44)
					{
						qbuffer.append((char)0xBB);
					}
					else if (buffer[i] == 0x33)
					{
						qbuffer.append((char)0xCC);
					}
					else
					{
						qDebug() << "Error, escaped character is not valid!:" << QString::number(buffer[i],16);
					}
					m_inescape = false;
				}
				else
				{
					//qDebug() << "Byte out of a packet:" << QString::number(buffer[i],16);
					byteoutofpacket += QString::number(buffer[i],16) + " ";
				}
			}
		}
		//qDebug() << "Bytes out of a packet:" << byteoutofpacket;
	}
}
Exemple #9
0
_xai_packet*   generatePacketFromParamNormal(_xai_packet_param_normal* normal_param){
    
    _xai_packet*  packet = generatePacket();
    
    
    uint8_t*  payload  =  malloc(1000);
    memset(payload,0,1000);
    
    if(!payload){
        
        return NULL;
    }
    
    uint16_t big_msgid = CFSwapInt16(normal_param->msgid);
    uint16_t big_magic_number = CFSwapInt16(normal_param->magic_number);
    uint16_t big_length = CFSwapInt16(normal_param->length);
    
    void* big_from = generateSwapGUID(normal_param->from_guid);
    void* big_to  = generateSwapGUID(normal_param->to_guid);
    
    //存入固定格式
    param_to_packet_helper(payload, big_from,_XPP_N_FROM_GUID_START,_XPP_N_FROM_GUID_END);
    param_to_packet_helper(payload, big_to  ,_XPP_N_TO_GUID_START,_XPP_N_TO_GUID_END);
    
    param_to_packet_helper(payload, &normal_param->flag, _XPP_N_FLAG_START, _XPP_N_FLAG_END);
    param_to_packet_helper(payload, &big_msgid, _XPP_N_MSGID_START, _XPP_N_MSGID_END);
    param_to_packet_helper(payload, &big_magic_number, _XPP_N_MAGIC_NUMBER_START, _XPP_N_MAGIC_NUMBER_END);
    param_to_packet_helper(payload, &big_length, _XPP_N_LENGTH_START, _XPP_N_LENGTH_END);
    
    
    purgeGUID(big_from);
    purgeGUID(big_to);
    
    
    /*fixed  size  */
    packet->fix_pos = _XPPS_N_FIXED_ALL;  //固定格式位置
    unsigned int pos = _XPPS_N_FIXED_ALL;
    
    /*preload --- fixed*/
    packet->pre_load =   malloc(pos);
    memset(packet->pre_load, 0, pos);
    memcpy(packet->pre_load, payload, pos);
    
    /*allload*/
    
    if (NULL !=  normal_param->data &&  0 != normal_param->length){
        
        packet->data_load = malloc(normal_param->length);
        memset(packet->data_load, 0, normal_param->length);
        memcpy(packet->data_load, normal_param->data, normal_param->length);
        
        param_to_packet_helper(payload, normal_param->data, _XPPS_N_FIXED_ALL, _XPPS_N_FIXED_ALL+normal_param->length);
        memcpy(payload+pos, normal_param->data, normal_param->length);
        
        pos +=  normal_param->length;
        
        
    }else{
        
        packet->data_load = NULL;
        
    }
    
    
    //复制内存到all
    packet->all_load = malloc(pos);
    memset(packet->all_load, 0, pos);
    memcpy(packet->all_load,payload,pos);
    
    packet->size = pos;
    
    free(payload);
    
    return packet;
}
DS2PStatus DS2Packet::packetFromRawPacket(const uint8_t* rawPacketData, uint16_t length, DS2PacketType type)
{
	int16_t dataLength;
	uint8_t checksum;
	this->type = type;
	
	if(type == DS2_8BIT)
	{
// 		DEBUG("8 bit: size: 0x%x at 0x%x: ", length, rawPacketData);
		if(length < 4)
		{
// 			DEBUG("insufficient data for 8 bit packet\r\n");
			return DS2_PSTATUS_INSUFFICIENT_DATA;
		}
		packetLength = rawPacketData[1];
		dataLength = packetLength - 3;
	}
	else if(type == DS2_16BIT)
	{
// 		DEBUG("16 bit: size: 0x%x at 0x%x: ", length, rawPacketData);
		if(rawPacketData[1] != 0x00)
		{
// 			DEBUG("high address byte is not 0x00: %x %x %x %x %x\r\n", rawPacketData[0], rawPacketData[1], rawPacketData[2], rawPacketData[3], rawPacketData[4]);
			return DS2_PSTATUS_INVALID;
		}
		if(length < 5)
		{
// 			DEBUG("insufficient data for 16 bit packet\r\n");
			return DS2_PSTATUS_INSUFFICIENT_DATA;
		}
		packetLength = rawPacketData[2];
		packetLength += rawPacketData[1] << 8;
		dataLength = packetLength - 4;
	}
	else
	{
		throw;
	}

	if(packetLength == 0)
	{
// 		DEBUG("bad packet: zero packet length: %x %x %x %x %x\r\n", rawPacketData[0], rawPacketData[1], rawPacketData[2], rawPacketData[3], rawPacketData[4]);
		return DS2_PSTATUS_INVALID;
	}
	if(packetLength > MAX_PACKET_LENGTH)
	{
// 		DEBUG("bad packet: packet length > 0x%x : %x %x %x %x %x\r\n", MAX_PACKET_LENGTH, rawPacketData[0], rawPacketData[1], rawPacketData[2], rawPacketData[3], rawPacketData[4]);
		return DS2_PSTATUS_INVALID;
	}
	if(dataLength <= 0)
	{
// 		DEBUG("bad packet: zero data length: %x %x %x %x %x\r\n", rawPacketData[0], rawPacketData[1], rawPacketData[2], rawPacketData[3], rawPacketData[4]);
		return DS2_PSTATUS_INVALID;
	}
	if(length < packetLength)
	{
// 		DEBUG("bad packet: insufficient data (want 0x%x)\r\n", packetLength);
		return DS2_PSTATUS_INSUFFICIENT_DATA;
	}

	if(type == DS2_8BIT)
	{
		setData(rawPacketData+2, dataLength);
		checksum = rawPacketData[dataLength + 2];
		
	}
	else if(type == DS2_16BIT)
	{
		setData(rawPacketData+3, dataLength);
		checksum = rawPacketData[dataLength + 3];
	}
	else
	{
		throw;
	}
	
	setAddress(rawPacketData[0]);

	//return true if packet has a valid checksum
	generatePacket();
	if(checksum == this->checksum)
		return DS2_PSTATUS_OK;
	else
		return DS2_PSTATUS_CHECKSUM_ERROR;
}
DS2Packet& DS2Packet::setAddress(int address)
{
	this->address = address;
	generatePacket();
	return *this;
}
Exemple #12
0
int main(int argc, char *argv[])
{
     /*
     int sockfd, portno; //sockfd:portno -> server socket
     socklen_t clilen;
     struct sockaddr_in serv_addr, cli_addr;

     if (argc < 2) {
         fprintf(stderr,"ERROR, no port provided\n");
         exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);	//create socket
     if (sockfd < 0)
        error("ERROR opening socket");
     memset((char *) &serv_addr, 0, sizeof(serv_addr));	//reset memory
     //fill in address info
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);

     if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
              error("ERROR on binding");

     listen(sockfd,10);	//5 simultaneous connection at most


     fd_set active_fd_set, read_fd_set; //set for holding sockets
     int newsockfd; //socket representing client

     // Initialize the set of active sockets
     FD_ZERO(&active_fd_set);
     FD_SET(sockfd, &active_fd_set); //put sock to the set to monitor new connections

     while(1){
        int i = 0;
    	 read_fd_set = active_fd_set;
    	 if(select(FD_SETSIZE,&read_fd_set,NULL,NULL,NULL)<0){error("ERROR select()");}//FAIL with exit status 1 on error

    	 for(i =0; i < FD_SETSIZE; i++){
    		 if(FD_ISSET(i, &read_fd_set)) {
				 if(i == sockfd)//new connection request
				 {
					 newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
					 if(newsockfd < 0) { error("ERROR accept()");}
					 FD_SET(newsockfd, &active_fd_set);
				 }
				 else{ // Data on connected socket

					 if (read_socket(i) < 0){
						 close(i);//close connection
						 FD_CLR(i, &active_fd_set);
					 }
				}
    		 }
    	 }
     }
     close(sockfd);
     
     */
     
     /*
     uint32_t test1[1] = {0x00000001};
     uint16_t cs1 = 0;
     cs1 = checksum((uint8_t *)test1, sizeof(uint32_t)*1);
     printf("given:%x, checksum:%x\n",test1[0],cs1);
    

     int i = 0;

     uint32_t seqNum = 0;
     uint32_t ACKNum = 0;
     bool ACK = 0;
     bool last = 0;
     uint16_t size = 0;
     uint16_t cs = 0;
     char data[MAX_BODY_SIZE];
     char * data_r;
     char *packetTest = malloc(sizeof(char)*PACKET_SIZE);
     memset(packetTest, 0, sizeof(char)*PACKET_SIZE);
    
     seqNum = 0x12345678;
     setSeqNum(packetTest, seqNum);
     seqNum = getSeqNum(packetTest);
     printf("seqNumTest set?=%x\n", seqNum);
     
     ACKNum =0x9ABCDEF0;
     setACKNum(packetTest, ACKNum);
     ACKNum = getACKNum(packetTest);
     printf("ACKNumTest set?=%x\n", ACKNum);

     ACK = true;
     setACK(packetTest, ACK);
     ACK = getACK(packetTest);
     printf("ack set?=%x\n",ACK);

     ACK = false;
     setACK(packetTest, ACK);
     ACK = getACK(packetTest);
     printf("ack set?=%x\n",ACK);
     

     last = true;
     setLast(packetTest, last);
     last = getLast(packetTest);
     printf("last set?=%x\n", last);

     last = false;
     setLast(packetTest, last);
     last = getLast(packetTest);
     printf("last set?=%x\n", last);
     
     setACK(packetTest, true);
     setLast(packetTest, true);

     size = 990;
     setSize(packetTest, size);
     size = getSize(packetTest);
     printf("size set?=%x\n",size);

     cs = checksum(packetTest, PACKET_SIZE);
     setChecksum(packetTest, cs);
     cs = getChecksum(packetTest);
     printf("checksum set?=%x\n", cs);

     //check that the sum is 1111
     cs = checksum(packetTest, PACKET_SIZE);
     printf("checksum zero?=%x\n", cs);

     strcpy(data, "Who wants to eat marshmellows?!");
     setData(packetTest, data, strlen(data));
     data_r = getData(packetTest);
     printf("data set?=\n%s\n",data_r);
     free(data_r);
*/
     int i = 0;
     char data[MAX_BODY_SIZE];
     char * data_r;
     strcpy(data, "Who wants to eat marshmellows?!");
     char * packetTest = generatePacket(0x12345678,
                                        0x9ABCDEF0,
                                        false,
                                        false,
                                        data,
                                        strlen(data));
     printPacket(packetTest);

     printf("test pkt bits\n");
     for(i = 0; i < PACKET_SIZE/32; i+=8)
     {
              printf("testbits, %08x %08x %08x %08x ",((uint32_t *)packetTest)[i], ((uint32_t *)packetTest)[i+1], ((uint32_t *)packetTest)[i+2], ((uint32_t *)packetTest)[i+3]);
        printf("%08x %08x %08x %08x\n",((uint32_t *)packetTest)[i+4], ((uint32_t *)packetTest)[i+5], ((uint32_t *)packetTest)[i+6], ((uint32_t *)packetTest)[i+7]);
     }
     free(packetTest);
     return 0;
}