发送矢量Winsock问题

时间:2016-10-20 14:35:32

标签: c++ vector winsock

第一次问一个问题!

我有一个小型服务器,它将对象向量发送到客户端:

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 iddouble 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

[求助]我试图多次发送向量的大小,而客户端只设置为接收一次。谢谢你的答案!

2 个答案:

答案 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);