可视化 将 TCP 服务器数据包保存到 C++ 中的文件



我在Visual Studio中创建了一个带有服务器和客户端的程序。这一切都是服务器从客户端接收数据包。现在这行得通了,我希望将数据存储在一个文件中,以便可以对其进行分析。下面是服务器的代码。

#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 servern", 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 clientn");

                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 %.1fn ", 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 typesn");
                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);
    }

我尝试自己做,但我无法弄清楚如何为服务器从客户端接收的数据包做到这一点。这是我的尝试和创建文件处理程序。

#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()
{
}

如果有人能通过使用我的代码向我展示一个示例来引导我朝着正确的方向前进,我会很棒。谢谢。

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

这样,将接收到的数据写入您发布的文件的代码将起作用。

最新更新