C ++& WINSOCK - Recv two struct&两条消息

时间:2014-04-26 20:08:19

标签: c++ c struct

我尝试收回我发送的所有数据。

我寄这个:

wpisano = send(maindll_socket, (char *)"witam", sizeof("witam"), 0);
wpisano2 = send(maindll_socket, (char *)"Pozdrawiam", sizeof("Pozdrawiam"), 0);

和recv

unsigned __stdcall main_pipe_server(void* Args)
{
    Sleep(500);
    LRESULT uiMessage;
    char wiadomosc[512];
    char tmpbuff[1024];
    int bytesRecv = SOCKET_ERROR;
    while (true){
        bytesRecv = recv(mainmenu::getInstance().dll_clients[0], wiadomosc, sizeof(wiadomosc), 0);
        if (bytesRecv > 0){
            MessageBox(NULL, (LPCSTR) wiadomosc, "DONE", NULL);
            sprintf_s(tmpbuff, 1023, "%s = %d | %d", wiadomosc, strlen(wiadomosc),bytesRecv );
            OutputDebugString(tmpbuff);
        }
        Sleep(1000);
    }
//(...)
}

结果是 -

MessageBox - “witam”

调试:“witam = 5 | 17”

那么第二个消息是什么?

以上是一个简单的问题。 但我尝试发送两个msg数据(其中一个是struct的数量,第二个是struct):

    int id=STRUCT_INIT_NUM;
    struct ST_ConInitChar a;
    a = { "BeCareful", python_func.py_getCurrentHp(), python_func.py_getMaxHp(), python_func.py_getMaxSp(), python_func.py_getMaxSp(), python_func.py_getMoney() };
    DWORD wpisano,wpisano2 = 0;
    wpisano = send(maindll_socket,(char *) &id, sizeof(id), 0);
    wpisano2 = send(maindll_socket, (char *)&a, sizeof(a), 0);

并且recv - 但它没有工作:

    unsigned __stdcall main_pipe_server(void* Args)
{
    Sleep(500);
    LRESULT uiMessage;
    char wiadomosc[512];
    char tmpbuff[1024];
    int bytesRecv = SOCKET_ERROR;
    while (true){
        bytesRecv = recv(mainmenu::getInstance().dll_clients[0], wiadomosc, sizeof(wiadomosc), 0);
        if (bytesRecv > sizeof(int)){
            char * p = wiadomosc;
            int *pId = (int*)p;
            p += sizeof(*pId);
            if (*pId == STRUCT_INIT_NUM){
                ST_ConInitChar * a = (ST_ConInitChar *)p;
                if (sizeof(a) > 0 && strlen(wiadomosc) > 0){
                    MessageBox(NULL, (LPCSTR)a->name, (LPCSTR) "DONE", NULL); // crash my program
                }
            }
        }
        Sleep(1000);
    }
//(...)
}

1 个答案:

答案 0 :(得分:2)

在第一个示例中,您总共发送17个字节,然后读取512个字节。您的wiadomosc缓冲区最终会收到这两条消息。您只看到一条消息正在显示,因为您在发送的数据中包含空终止符,然后将接收的数据视为空终止字符串。字符串文字实现为const char[],因此您实际上是这样做的:

const char str1[] = "witam"; // "witam\0"
wpisano = send(maindll_socket, (char *)str1, sizeof(str1), 0); // sizeof = 6, not 5

如果您不希望数据以空值终止,请使用strlen()代替sizeof()

您的第二个示例不起作用,因为您的struct name成员是指向结构本身未包含的外部数据的指针。发送结构时,您将发送指针本身,而不是它指向的数据。在这种情况下,您不能按原样发送结构,您需要将其序列化为可传输格式并发送,然后接收它并将其反序列化为有意义的结构。您不必使用POD类型(如整数),而是使用指针,如字符串。我建议你发一个字符串的长度,然后是字符串的字符。这样,您可以先读取长度,分配足够的缓冲区,然后读取其中的字符。