Avatar billede krismort Nybegynder
18. juni 2004 - 20:16 Der er 2 kommentarer

spm ang. netværkspakke

Jeg skal sende nogen beskeder til clienter i mit program over internettet til det har jeg valgt at bruge TCP/IP og dele data strømmen op i pakker.
pakkerne består af en header og et indhold som skal svarer overens med headerens information.

struct sPacketHeader {
  byte typeid; //fortæller os hvilken type pakken er af
  byte lenght; //indholdets længde, bemærk max 256 i længde
  byte checksum; //checksum af pakke indhold, jeg vil gerne spare båndbredde derfor 1 byte lang.
};

Mit spørgsmål lyder så på følgende:
1. er der nogen som kan en metode til at regne en 1 byte's checksum ud på? eller vil det være klogerer at benytte en anden/større variabel til at holde en checksum ?

2. er der nogen som har et forklag til en smuk løsning hvor man kan behandle den inkomne datafra en data strøm? Indtil viderer så har har jeg en metode som er meget lang og som ser ud alà:

void processPacket(packetheader hdr, packetcontext ctx) {
  if(hdr.typeid == 1) {
    gør et eller andet
  }

  if(hdr.typeid == 2) {
  gør et eller andet
  }

  osv.osv.osv....
}

denne metode kommer desværre til at se forfærdentlig land ud, er der nogen som har en mere objekt orienteret metode til at gøre det på så ville jeg meget gerne høre om det.

vh
- Kristian
Avatar billede arne_v Ekspert
18. juni 2004 - 20:20 #1
re 1)

Godt råd: brug 2 byte og find en af de anerkendte 16 bit CRC algoritmer

Dårligt råd: bare lig alle bytene sammen

re 2)

Læs 1 byte med typeid og switch på den og lav kun et kald i hver case label.
Avatar billede bertelbrander Novice
18. juni 2004 - 23:54 #2
1: Eftersom TCP/IP "garanterer" fejlfri transmision kunne man måske godt forsvarre en chksum der blot er summen af data.

2: Man kunne måske bruge noget i stil med:

#include <iostream>

#define NUM_TYPES 4

typedef unsigned char byte;

struct PacketHeader
{
  byte TypeId;
  byte Lenght;
  byte CheckSum;
};

typedef void (*PacketHandler)(PacketHeader *);

void Func1(PacketHeader *Packet)
{
  std::cout << "Type 1" << std::endl;
}

void Func2(PacketHeader *Packet)
{
  std::cout << "Type 2" << std::endl;
}

void Func3(PacketHeader *Packet)
{
  std::cout << "Type 3" << std::endl;
}

void Func4(PacketHeader *Packet)
{
  std::cout << "Type 3" << std::endl;
}

PacketHandler PacketHandlerTable[NUM_TYPES] =
{Func1, Func2, Func3, Func4};

void Dispatcher(PacketHeader *Packet)
{
  if(Packet->TypeId < NUM_TYPES)
    PacketHandlerTable[Packet->TypeId](Packet);
  else
    std::cout << "Unknown Type: " << int(Packet->TypeId) << std::endl;
}

int main()
{
  PacketHeader PH;
  PH.TypeId = 0;
  Dispatcher(&PH);
  PH.TypeId = 3;
  Dispatcher(&PH);
  PH.TypeId = 5;
  Dispatcher(&PH);
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester