C++ 将TCP服务器数据包保存到C++;
我在VisualStudio中创建了一个带有服务器和客户端的程序。这一切都是服务器从客户端接收数据包的工作。现在,这项工作,我希望数据存储在一个文件中,以便它可以分析。这是服务器的代码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) { /
#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;
}