2017-04-13 1 views
0

Visual Studio에서 서버와 클라이언트로 프로그램을 만들었습니다. 이것은 모두 서버가 클라이언트로부터 데이터 패킷을 수신하는 방식으로 작동합니다. 이제는이 작업을 통해 데이터를 파일에 저장하여 분석 할 수있게되었습니다. 다음은 서버 코드입니다.C++의 파일에 TCP 서버 데이터 패킷 저장

#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

void에서 Packet으로 receiveFromClients의 반환 형식을 변경하고받은 패킷을 반환하십시오.

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

게시 된 파일에 수신 된 데이터를 쓰는 코드가 작동합니다.