2012-02-21 15 views
0

私は仕事用のWindowsソケットアプリケーションを書く必要がありますが、ネットワークプログラミングの経験はほとんどありません。私は少し助けが必要です。部分的にrecv用のバッファを割り当てる

サーバーからさまざまなデータをリクエストするためにいくつかの機能を用意する必要があります。その1つを乱数などを例として使用します。

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; 

OK。今すぐ 'p'の中にはサーバーからの乱数の配列があります。 「p」を除いて、入ってくるパケットの一部である他のデータも含まれています。私がしたいのは、完了したときに乱数を格納するために渡されるバッファです。私は、着信パケットの構造を知っていたし、それはのようなものだった場合:

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

その後、ちょうど渡されたのmemcpy、関数の中で、char *を作成し、パケットの最初の3人のメンバーのためにメモリを割り当てることが可能であるが終わりまでバッファーに?多分それほど正確ではないかもしれませんが、あなたは私のドリフトを得るでしょう。その結果、呼び出し関数はintの配列を作成し、そのアドレスを関数に渡し、呼び出し関数の配列に乱数受信したパケットに含まれていました。明日の仕事までこれをテストすることはできませんが、それは私の心の中にあります。

ありがとうございました。

答えて

0

2つの別々のバッファを使用する必要があります。ファンクションがパケット全体を受信するために使用するバッファー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); 
} 
+0

乾杯しています。これはおそらくバッファを提供するユーザの目的に反しますが、私たちが必要とするスペースの約2倍のスペースを割り当てるので、関数は構造体のインスタンスを作成し、呼び出し関数は大きな配列を作成します。おそらく、私はちょうどデータへのポインタを返すほうがよいでしょう。ありがとう。 –

関連する問題