Частично выделение буфера для recv - PullRequest
0 голосов
/ 22 февраля 2012

Мне нужно написать приложение Windows Sockets для работы, но я практически не имею опыта сетевого программирования. Мне нужна небольшая помощь.

Мне нужно сделать несколько функций для отправки запросов на разные данные.с сервера, давайте использовать одну из этих вещей, случайные числа, в качестве примера.

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

метод возвращает DWORD, представляющий либо успех, либо сообщение об ошибке, и должен получить буфер из вызывающей функциикоторый может называть это так:

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

Внутри функции:

//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;

ОК.Теперь внутри 'p' находится массив случайных чисел с сервера - отлично!Кроме «р» также содержит другие данные, которые являются частью входящего пакета.То, что я хотел бы для буфера, который передается, чтобы просто содержать случайные числа, когда я закончу.Если я знал структуру входящего пакета, и это было что-то вроде:

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

можно ли создать в функции char * и выделить память для первых трех членов пакета, а затем просто memcpyпереданный в буфер до конца?Возможно, не совсем так, но вы понимаете, в чем дело, результат должен состоять в том, что вызывающая функция может просто создать массив целых чисел, передать свой адрес функции, а когда это будет сделано, массив в вызывающей функции содержит только случайные числа, которыебыли в полученном пакете.Я не могу проверить это до завтрашней работы, но это было в моей голове.

Спасибо.

1 Ответ

0 голосов
/ 22 февраля 2012

Вам нужно будет использовать два отдельных буфера.Один буфер, который используется функцией для приема всего пакета, а затем буфер вызывающего, который принимает только те части пакета, которые ему интересны. Например:

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);
}
...