C++ 将TCP服务器数据包保存到C++;

C++ 将TCP服务器数据包保存到C++;,c++,visual-c++,file-io,tcp,file-handling,C++,Visual C++,File Io,Tcp,File Handling,我在VisualStudio中创建了一个带有服务器和客户端的程序。这一切都是服务器从客户端接收数据包的工作。现在,这项工作,我希望数据存储在一个文件中,以便它可以分析。这是服务器的代码 #include "StdAfx.h" #include "ServerExample.h" #include <iostream> unsigned int ServerExample::client_id; ServerExample::ServerExample(void) { /

我在VisualStudio中创建了一个带有服务器和客户端的程序。这一切都是服务器从客户端接收数据包的工作。现在,这项工作,我希望数据存储在一个文件中,以便它可以分析。这是服务器的代码

#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);
    }
#包括“StdAfx.h”
#包括“ServerExample.h”
#包括
unsigned int ServerExample::client_id;
ServerExample::ServerExample(无效)
{
//为我们的表分配客户端的id
客户端id=0;
//设置服务器网络以侦听
网络=新服务器网络();
}
ServerExample::~ServerExample(无效)
{
}
void ServerExample::update()
{
//获得新客户
if(网络->接受新客户机(客户机id))
{
printf(“客户端%d已连接到服务器,\n”,客户端id);
//为下一个客户端增加客户端ID
客户端id++;
}
receiveFromClients();
}
void服务器示例::receiveFromClients()
{
数据包;
//使用迭代器遍历所有客户端
std::map::迭代器iter;
对于(iter=network->sessions.begin();iter!=network->sessions.end();iter++)
{
int data_length=网络->接收数据(iter->第一,网络_数据);
if(数据长度发送至所有(数据包数据、数据包大小);
}
我自己也尝试过这样做,但我不知道如何处理服务器从客户端接收的数据包

#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()
{
}
#包括“stdafx.h”
#包括“FileHandler.h”
#包括
#包括
使用名称空间std;
FileHandler::FileHandler()
{
}
int FileHandler::myFile(){
流包文件;
PacketFile.open(“packetData.txt”);
//这是我搞不懂的部分

PacketFile将receiveFromClients的返回类型从
void
更改为
Packet
,并返回收到的数据包

然后创建一个
操作符
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;
}