【问题标题】:Partially allocating a buffer for recv为 recv 部分分配缓冲区
【发布时间】:2012-02-21 21:03:13
【问题描述】:

我需要为工作编写一个 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 到最后?也许不完全一样,但你明白我的意思,结果应该是调用函数可以创建一个整数数组,将它的地址传递给函数,当它完成时,调用函数中的数组只包含随机数在收到的数据包中。明天上班之前我无法对此进行测试,但我一直在考虑。

谢谢。

【问题讨论】:

    标签: windows sockets network-programming winsock winsock2


    【解决方案1】:

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

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

    【讨论】:

    • 干杯雷米,有道理。这可能违背了用户提供缓冲区的目的,尽管我们分配的空间几乎是我们需要的两倍,函数创建了一个结构实例,调用函数创建了一个大数组。也许我最好只返回一个指向数据的指针。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2013-09-26
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    相关资源
    最近更新 更多