Beispiel #1
0
int readFile(int port)
{
	ControlPacket packet;
	while(!getControlPacket(port, &packet)){}
	//puts("\nGot beginning packet");
	if(packet.end != CONTROL_PACKET_BEGIN){
		printf("Error: didn't receive expected start control package\n");
		return -1;
	}

	int file = open(packet.filename+1, O_CREAT|O_TRUNC|O_WRONLY, 0666);
	free(packet.filename);
	DataPacket dataPacket;
	unsigned char expectedSequenceNumber = 0;
	float percentage;
	int acum = 0;
	char * proBar = updateProgressBar(0, packet.size, &percentage);
	while(getDataPacket(port, &dataPacket) != E_NOTDATA){

		if (expectedSequenceNumber != dataPacket.sequenceNumber){
			printf("Error in packet sequence: expected packet no %u and got packet no %u\n", expectedSequenceNumber, dataPacket.sequenceNumber);
		exit(-1);
		}
		expectedSequenceNumber++;
		expectedSequenceNumber %= 255;
		
		//printf("Received data packet with size %d\n", dataPacket.size);
		write(file, dataPacket.data, dataPacket.size);
		acum += dataPacket.size;
		proBar = updateProgressBar(acum, packet.size, &percentage);
		if(visMode != 0)
			printProgressBar(proBar, percentage);
		free(dataPacket.data);

	}
	printf("\n");
	unsigned char* dump;
	while(llread(port, &dump) != E_CLOSED){}	
	//puts("discei");
	return 0;
}
Beispiel #2
0
XBool XNetServer::getDataPacket(unsigned char *buff,int len)
{
	if(len <= 0) return XTrue;
	int offset = 0;
	if(m_recvPacketSize == 0)
	{
		if(len >= PACKET_HEAD_LEN)
		{//完整的包头
			m_recvPacket = XMem::createMem<XNetData>();
			if(m_recvPacket == NULL) return XFalse;
			m_recvPacket->type = (XNetDataType)buff[0];
			memcpy(&(m_recvPacket->dataLen),buff + 1,sizeof(int));
			m_recvPacket->data = XMem::createArrayMem<unsigned char>(m_recvPacket->dataLen);
			if(m_recvPacket->data == NULL) return XFalse;
			if(len - PACKET_HEAD_LEN >= m_recvPacket->dataLen)
			{//数据完整
				m_recvPacket->isEnable = XTrue;
				memcpy(m_recvPacket->data,buff + PACKET_HEAD_LEN,m_recvPacket->dataLen);
				offset = PACKET_HEAD_LEN + m_recvPacket->dataLen;
				m_mutex.Lock();
				m_recvDataBuff.push_back(m_recvPacket);
				if(m_recvDataBuff.size() > MAX_RECV_DATA_BUFF)
				{
					XNetData *tmp = m_recvDataBuff[0];
					m_recvDataBuff.pop_front();
					LogStr("XNetServer接收队列数据发生拥堵,丢弃较老的数据!");
					XMem::XDELETE_ARRAY(tmp->data);
					XMem::XDELETE(tmp);
				}
				m_mutex.Unlock();
				m_recvPacketSize = 0;
				//继续迭代
				return getDataPacket(buff + offset,len - offset);
			}else
			{//数据不完整
				m_recvPacket->isEnable = XFalse;	//数据包尚不完整
				memcpy(m_recvPacket->data,buff + PACKET_HEAD_LEN,len - PACKET_HEAD_LEN);
				m_recvPacketSize = len;
				return XTrue;
			}
		}else
		{//不完整的包头
			m_recvPacketSize = len;
			memcpy(m_packetHeadData,buff,len);
			return XTrue;
		}
	}else
	{
		if(m_recvPacketSize >= PACKET_HEAD_LEN)
		{//包头已经接收完整
			if(len >= m_recvPacket->dataLen - m_recvPacketSize + PACKET_HEAD_LEN)
			{//完整的
				memcpy(m_recvPacket->data + m_recvPacketSize - PACKET_HEAD_LEN,buff,m_recvPacket->dataLen - m_recvPacketSize + PACKET_HEAD_LEN);
				m_recvPacket->isEnable = XTrue;
				offset = m_recvPacket->dataLen - m_recvPacketSize + PACKET_HEAD_LEN;
				m_mutex.Lock();
				m_recvDataBuff.push_back(m_recvPacket);
				if(m_recvDataBuff.size() > MAX_RECV_DATA_BUFF)
				{
					XNetData *tmp = m_recvDataBuff[0];
					m_recvDataBuff.pop_front();
					m_mutex.Unlock();
					LogStr("XNetServer接收队列数据发生拥堵,丢弃较老的数据!");
					XMem::XDELETE_ARRAY(tmp->data);
					XMem::XDELETE(tmp);
				}else
					m_mutex.Unlock();
				m_recvPacketSize = 0;
				//迭代
				return getDataPacket(buff + offset,len - offset);
			}else
			{//不完整的
				memcpy(m_recvPacket->data + m_recvPacketSize - PACKET_HEAD_LEN,buff,len);
				m_recvPacketSize += len;
				return XTrue;
			}
		}else
		{//包头尚未接收完整
			if(m_recvPacketSize + len >= PACKET_HEAD_LEN)
			{//包头将会完整
				memcpy(m_packetHeadData + m_recvPacketSize,buff,PACKET_HEAD_LEN - m_recvPacketSize);
				//解析包头
				m_recvPacket = XMem::createMem<XNetData>();
				if(m_recvPacket == NULL) return XFalse;
				m_recvPacket->type = (XNetDataType)m_packetHeadData[0];
				memcpy(&(m_recvPacket->dataLen),m_packetHeadData + 1,sizeof(int));
				m_recvPacket->data = XMem::createArrayMem<unsigned char>(m_recvPacket->dataLen);
				if(m_recvPacket->data == NULL) return XFalse;
				//解析余下的数据
				if(len - (PACKET_HEAD_LEN - m_recvPacketSize) >= m_recvPacket->dataLen)
				{//数据完整
					m_recvPacket->isEnable = XTrue;
					memcpy(m_recvPacket->data,buff + (PACKET_HEAD_LEN - m_recvPacketSize),m_recvPacket->dataLen);
					offset = PACKET_HEAD_LEN - m_recvPacketSize + m_recvPacket->dataLen;
					m_mutex.Lock();
					m_recvDataBuff.push_back(m_recvPacket);
					m_mutex.Unlock();
					m_recvPacketSize = 0;
					//继续迭代
					return getDataPacket(buff + offset,len - offset);
				}else
				{//数据不完整
					m_recvPacket->isEnable = XFalse;	//数据包尚不完整
					memcpy(m_recvPacket->data,buff + (PACKET_HEAD_LEN - m_recvPacketSize),len - (PACKET_HEAD_LEN - m_recvPacketSize));
					m_recvPacketSize += len;
					return XTrue;
				}
			}else
			{//包头仍然不完整
				memcpy(m_packetHeadData + m_recvPacketSize,buff,len);
				m_recvPacketSize += len;
				return XTrue;
			}
		}
	}
}