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; }
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; } } } }