2017-04-13 117 views
0

我在Visual Studio中創建了一個包含服務器和客戶端的程序。這一切都可以用於服務器從客戶端接收數據包。現在,這個工作,我希望數據存儲在一個文件,以便它可以進行分析。這是服務器的代碼。將TCP服務器數據包保存到C++中的文件

#include "StdAfx.h" 
#include "ServerExample.h" 
#include <iostream> 


unsigned int ServerExample::client_id; 

ServerExample::ServerExample(void) 
{ 
    // id's to assign clients for our table 
    client_id = 0; 

    // set up the server network to listen 
    network = new ServerNetwork(); 
} 

ServerExample::~ServerExample(void) 
{ 
} 

void ServerExample::update() 
{ 
    // get new clients 
    if (network->acceptNewClient(client_id)) 
    { 
     printf("client %d has been connected to the server\n", client_id); 

     //increment client ID for the next client 
     client_id++; 
    } 

    receiveFromClients(); 

} 


void ServerExample::receiveFromClients() 
{ 

    Packet packet; 

    // go through all clients using an iterator 
    std::map<unsigned int, SOCKET>::iterator iter; 

    for (iter = network->sessions.begin(); iter != network->sessions.end(); iter++) 
    { 
     int data_length = network->receiveData(iter->first, network_data); 

     if (data_length <= 0) 
     { 
      //no data recieved 
      continue; 
     } 

     int i = 0; 
     while (i < (unsigned int)data_length) 
     { 
      packet.deserialize(&(network_data[i])); 
      i += sizeof(Packet); 

      //switch based on packet type 
      switch (packet.packet_type) { 

      case INIT_CONNECTION: 

       printf("server received init packet from client\n"); 


       sendActionPackets(); 
       int c; 
       cout << "Press the return key to continue "; 
       c = cin.get(); 
       if (c == '\n') { 


       break; 

//HERE ARE THE PACKETS I WANT STORED IN THE FILE 
      case DATA_EVENT: 
       printf("clientID %d ", packet.clientID); 
       printf("speed %d ", packet.speed); 
       printf("longitude %.f ", packet.longitude); 
       printf("latitude %.f ", packet.latitude); 
       printf("temperature %.1f\n ", packet.temperature); 
       printf("fuelLevel %.1f ", packet.fuelLevel); 
       sendActionPackets(); 


       if (packet.speed < 20) { 
        printf(" Speed is too low please report any problems. "); 
       } 
       else if (packet.temperature > 29) 
       { 
        printf(" Please check temperature. Too high. "); 
       } 
       else if (packet.temperature < 10) 
       { 
        printf(" Please check temperature. Too low. "); 


        break; 

      default: 

       printf("error in packet types\n"); 

       break; 
       } 
       } 
      } 
     } 
    } 
} 
    void ServerExample::sendActionPackets() 
    { 
     // send action packet 
     const unsigned int packet_size = sizeof(Packet); 
     char packet_data[packet_size]; 

     Packet packet; 
     packet.packet_type = DATA_EVENT; 

     packet.serialize(packet_data); 

     network->sendToAll(packet_data, packet_size); 
    } 

我有一個嘗試自己做,但我不知道如何做到這一點從服務器從客戶端接收數據包。這是我的嘗試,並創建fileHandler。

#include "stdafx.h" 
#include "FileHandler.h" 
#include <iostream> 
#include <fstream> 

using namespace std; 
FileHandler::FileHandler() 
{ 
} 
int FileHandler::myFile() { 
    ofstream PacketFile; 
    PacketFile.open("packetData.txt"); 

    //This is the part I can't figure out 
    PacketFile << receiveFromClients(); 

    PacketFile.close(); 
} 

FileHandler::~FileHandler() 
{ 
} 

我想偉大的,如果有人可以通過展示我用我的代碼的例子指導我在正確的方向。謝謝。

回答

1

將receiveFromClients的返回類型從void更改爲Packet並返回接收到的數據包。

然後爲Packet類創建一個operator <<。例如:

std::ostream& operator <<(std::ostream& ostream, const Packet& packet) 
{ 
    if(packet.packet_type == DATA_EVENT) 
    { 
    ostream << packet.clientID << ";" 
     << packet.speed << ";" 
     << packet.longitude << ";" 
     << packet.latitude << ";" 
     << packet.temperature << ";" 
     << packet.fuelLevel << std::endl; 
    } 

    return ostream; 
} 

用這個代碼將接收到的數據寫入到您發佈的文件中即可。

相關問題