windows - Delvist tildeling af buffer til recv

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skal skrive en Windows-stikkontakt til arbejde, men har næsten ingen erfaring med netværksprogrammering. Jeg har brug for lidt hjælp.


Jeg skal gøre flere funktioner for at stille anmodninger om forskellige data fra en server, lad os bruge et af disse ting, tilfældige tal, som et eksempel.


DWORD GetRandomNumbers(int amount, int* buffer, int bufferSize);


Metoden returnerer en DWORD, der repræsenterer enten succes eller en fejlmeddelelse, og skal få bufferen fra den kaldende funktion, der kan kalde den sådan:


int numbers[10];
GetRandomNumbers(10,numbers,10);


Inde i funktionen:


//set up packet containing request
//send the packet
//then call recv
recv(m\_socket, (char*)buffer, bufferSize, 0);
//now cast the char array to a struct defining the incoming message packet
RandNumPacketIn* p = (RandNumPacketIn*)buffer;


OKAY. Nu inden for 'p' er en række tilfældige tal fra serveren - fantastisk! Bortset fra 'p' indeholder også andre data, som er en del af den indkommende pakke. Hvad jeg gerne vil, er for den buffer, der sendes ind for at bare indeholde de tilfældige tal, når jeg er færdig. Hvis jeg kendte strukturen af ​​den indkommende pakke, og det var noget som:


struct incomingrandnums
{
    int a;
    int b;
    char c;
    int numbers[100];
}   


er det muligt at oprette en char * i funktionen og tildele hukommelse til de tre første medlemmer i pakken, så husk bare at passere i buffer til slutningen? Måske ikke akkurat sådan, men du får min glidning, bør resultatet være, at den kaldende funktion bare kan skabe en matrix af ints, videregive sin adresse til funktionen, og når den er færdig, er arrayet i opkaldsfunktionen kun de tilfældige tal, som var i den modtagne pakke. Jeg kan ikke teste dette ud til arbejde i morgen, men det har været på mine tanker.


Tak.

Bedste reference


Du skal bruge to separate buffere. En buffer, som funktionen bruger til at modtage hele pakken, og derefter opkaldsens buffer, der modtager kun de dele af den pakke, som den, der ringer op, er interesseret i. For eksempel:


struct packet
{
    int a;
    int b;
    char c;
    int numbers[100];
};   

struct randnums
{
    int a;
    int b;
    char c;
};   

DWORD GetRandomNumbers(randnums &nums)
{
    packet pckt;
    recv(m\_socket, (char*)&pckt, sizeof(pckt), 0);
    memcpy(&nums, &pckt, sizeof(nums));
}

{
    randnums numbers;
    GetRandomNumbers(numbers);
}