2017-04-13 110 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; 
} 

用这个代码将接收到的数据写入到您发布的文件中即可。

相关问题