Avatar billede nielsenmathias Nybegynder
09. marts 2005 - 11:38 Der er 4 kommentarer og
1 løsning

opsætning af header-felter, samt transmission over socket

Hejsa.

Jeg arbejder på et projekt der anvender en protokol hvor pakkeformatet indeholder:
12 byte header
payload

Headerens felter skal sættes byte-wise og dynamisk alt efter hvilken situation man er i. Mit spørgsmål er:
hvordan får man sat de forskellige felter, og hvordan får man sendt pakken over netværket?

jeg forestiller mig en header struct med forskellige typer, der kan sættes. men hvordan får jeg de forskellige felter samlet til én samlet struktur jeg kan sende? det er ikke noget problem at sende en tekst streng over en socket, men hvordan får jeg sendt de forskellige header-felter, samt payload?

Mathias
Avatar billede arne_v Ekspert
09. marts 2005 - 18:23 #1
Flere muligheder:
* lav en struct af structs (evt. krydret med lidt union) som kan have det hele
* skriv ned i et byte array ved hele tiden at caste en char pointer til
  pointer til struct og fylde i
Avatar billede arne_v Ekspert
09. marts 2005 - 18:37 #2
Eksempel på det sidste:

#include <stdio.h>

struct hdr
{
  char data1present;
  char data2present;
  char data3present;
};

struct data1
{
    short v1;
};

struct data2
{
    short v2;
};

struct data3
{
    short v3;
};

void print(char *buf, int n)
{
    int i;
    for(i=0;i<n;i++) printf(" %d",(unsigned int)buf[i]);
    printf("\n");
}

void packandprint(int v1, int v2, int v3)
{
    char buf[sizeof(struct hdr) + sizeof(struct data1) + sizeof(struct data2) + sizeof(struct data3)];
    char *p;
    struct hdr *phdr;
    struct data1 *pdata1;
    struct data2 *pdata2;
    struct data3 *pdata3;
    p = buf;
    phdr = (struct hdr *)p;
    phdr->data1present = v1 > 0 ? 1 : 0;
    phdr->data2present = v2 > 0 ? 1 : 0;
    phdr->data3present = v3 > 0 ? 1 : 0;
    p += sizeof(struct hdr);
    if(v1 > 0)
    {
        pdata1 = (struct data1 *)p;
        pdata1->v1 = v1;
        p += sizeof(struct data1);
    }
    if(v2 > 0)
    {
        pdata2 = (struct data2 *)p;
        pdata2->v2 = v2;
        p += sizeof(struct data2);
    }
    if(v3 > 0)
    {
        pdata3 = (struct data3 *)p;
        pdata3->v3 = v3;
        p += sizeof(struct data3);
    }
    print(buf, p-buf);
}

int main()
{
    packandprint(1, -1, 7);
    return 0;
}
Avatar billede arne_v Ekspert
09. marts 2005 - 18:38 #3
Jeg ved ikke hvor meget det ligner din problem stlling.

Jeg har gættet ig lidt frem.

print(buf, p-buf);

kan naturligvis nemt erstattes med:

send(sd, buf, p-buf, 0);
Avatar billede nielsenmathias Nybegynder
11. marts 2005 - 11:38 #4
noget i den stil, har i hvert fald fået det til at virke nu :)
stik mig et svar, så er der payday :)
Avatar billede arne_v Ekspert
11. marts 2005 - 11:45 #5
kommer her
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