将TCP服务器数据包保存到C++中的文件
问题描述:
我在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()
{
}
我想伟大的,如果有人可以通过展示我用我的代码的例子指导我在正确的方向。谢谢。
答
将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;
}
用这个代码将接收到的数据写入到您发布的文件中即可。