0
Visual Studio에서 서버와 클라이언트로 프로그램을 만들었습니다. 이것은 모두 서버가 클라이언트로부터 데이터 패킷을 수신하는 방식으로 작동합니다. 이제는이 작업을 통해 데이터를 파일에 저장하여 분석 할 수있게되었습니다. 다음은 서버 코드입니다.C++의 파일에 TCP 서버 데이터 패킷 저장
#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()
{
}
누군가 내 코드를 사용하여 예제를 보여줌으로써 올바른 방향으로 안내 할 수 있다면 좋을 것입니다. 감사.