我需要为工作编写一个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数组,将其地址传递给函数,当它完成时,调用函数中的数组只包含随机数在收到的数据包中。我不能在明天上班之前对此进行测试,但这一直是我的想法。
感谢。
答案 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);
}