第一次问一个问题!
我有一个小型服务器,它将对象向量发送到客户端:
void sendFoo(vector<Foo> &foo){
int num = foo.size();
sSend = accept(sListen, (SOCKADDR*)&addr, &addrLen);
for(int i = 0; i < num; i++){
if(sSend == NULL){
cout << "Not connected" << endl;
} else {
//send vector size
send(sSend, (char*)&num, sizeof(num), NULL);
//send foo(s)
send(sSend, (char*)&foo[i], sizeof(foo[i]), NULL);
}
}
closesocket(sSend);
}
foo类包含int id
和double transformation[3][4]
。
我的客户端应用程序打印出ID及其收到的转换:
sRecv = socket(AF_INET, SOCK_STREAM, NULL);
if (connect(sRecv, (SOCKADDR*)&addr, addrLen) != 0) {
cout << "Not connected to server" << endl;
} else {
recv(sRecv, (char*)&num, sizeof(num), NULL);
vector<Foo> foo(num);
for (int i = 0; i < num; i++){
recv(sRecv, (char*)&foo[i], sizeof(foo[i]), NULL);
//prints them out
}
}
如果我创建1个Foo并通过客户端发送它,请正确打印:
Foo ID: 1
Foo Transformation:
1.0000 2.0000 3.0000 4.0000
1.0000 2.0000 3.0000 4.0000
1.0000 2.0000 3.0000 4.0000
但是当我尝试发送多个时,我得到的内容就像每个其他块一样:
Foo ID: 1
Foo 1 Transformation:
1.0000 2.0000 3.0000 4.0000
1.0000 2.0000 3.0000 4.0000
1.0000 2.0000 3.0000 4.0000
Foo ID: 4
Foo 4 Transformation:
-6.27744e+66 -6.27744e+66 -6.27744e+66 -6.27744e+66
-6.27744e+66 -6.27744e+66 -6.27744e+66 -6.27744e+66
-6.27744e+66 -6.27744e+66 -6.27744e+66 -6.27744e+66
Foo ID: 2
Foo 2 Transformation:
1.0000 2.0000 3.0000 4.0000
1.0000 2.0000 3.0000 4.0000
1.0000 2.0000 3.0000 4.0000
Foo ID: 4
Foo 4 Transformation:
1.70592e-314 5.29981e-315 5.30499e-315 5.30758e-315
5.31017e-315 5.29981e-315 5.30499e-315 5.30758e-315
5.31017e-315 5.29981e-315 5.30499e-315 5.30758e-315
//etc
[求助]我试图多次发送向量的大小,而客户端只设置为接收一次。谢谢你的答案!
答案 0 :(得分:0)
好吧,我会说调试器将是你最好的朋友。我也有点惊讶收到的结果给你显示的打印输出,也许更多的问题没有显示。
查看以下行的位置:
send(sSend, (char*)&num, sizeof(num), NULL);
与你收到的地方相比:
recv(sRecv, (char*)&num, sizeof(num), NULL);
提示,你拨打的电话不仅仅是recv。
答案 1 :(得分:0)
要通过套接字发送类,需要在原始内存块中对其进行序列化。你不能直接发送C ++对象。
创建一个函数uint_32_t Foo::exportRaw( void **buffer) ;
,它将为缓冲区分配原始内存,让你上课&#39;其中的成员,然后返回分配的大小,通过套接字发送它。
请勿忘记在发送缓冲区时释放缓冲区内存并且无用。
以下是一个例子:
void *buffer;
uint32_t sizeAlloc;
sizeAlloc = foo[i].exportRaw(&buffer); // serialize object
//send foo(s)
send(sSend, (char*)buffer, sizeAlloc, NULL);
free(buffer);