2012-02-21 116 views
0

我需要编写一个用于工作的windows套接字应用程序,但实际上没有网络编程经验,我需要一点帮助。为recv部分分配缓冲区

我需要制作几个函数来向服务器发出不同的数据请求,让我们以这些东西之一,随机数为例。

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数组,将它的地址传递给函数,当调用函数中的数组只包含随机数在收到的数据包中。我不能在明天工作之前对此进行测试,但这一直是我的想法。

谢谢。

回答

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

干杯雷米,有道理。这可能会破坏用户提供缓冲区的目的,尽管我们正在分配几乎两倍的空间,但函数会创建一个结构实例,调用函数会创建一个大型数组。也许我最好只是返回一个指向数据的指针。谢谢。 – 2012-02-22 08:35:48