部分为recv分配缓冲区

时间:2012-02-21 21:03:14

标签: windows sockets network-programming winsock winsock2

我需要为工作编写一个Windows套接字应用程序,但几乎没有网络编程经验,我需要一些帮助。

我需要制作几个函数来从服务器请求不同的数据,让我们使用其中一个,随机数,作为一个例子。

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'内是来自服务器的一组随机数 - 太棒了!除'p'外还包含其他数据,这些数据是传入数据包的一部分。我想要的是当我完成时传入的缓冲区只包含随机数。如果我知道传入数据包的结构,它就像是:

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

是否可以在函数中创建char *并为数据包中的前三个成员分配内存,然后将传入的缓冲区memcpy到最后?也许不是那样,但你得到了我的漂移,结果应该是调用函数可以只创建一个int数组,将其地址传递给函数,当它完成时,调用函数中的数组只包含随机数在收到的数据包中。我不能在明天上班之前对此进行测试,但这一直是我的想法。

感谢。

1 个答案:

答案 0 :(得分:0)

您需要使用两个单独的缓冲区。函数用于接收整个数据包的一个缓冲区,然后是调用者的缓冲区,它只接收调用者感兴趣的数据包部分。例如:

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