2017-04-13 19 views
0

Visual Studioにサーバーとクライアントを持つプログラムを作成しました。これはすべて、サーバーがクライアントからデータパケットを受信して​​動作します。これで、データをファイルに保存して分析できるようになりました。ここにサーバーのコードがあります。私が持っているC++のファイルにTCP Serverのデータパケットを保存する

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

これで、送信したファイルに受信データを書き込むコードが機能します。

関連する問題