2012-02-21 96 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