我尝试收回我发送的所有数据。
我寄这个:
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);
}
//(...)
}
答案 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类型(如整数),而是使用指针,如字符串。我建议你发一个字符串的长度,然后是字符串的字符。这样,您可以先读取长度,分配足够的缓冲区,然后读取其中的字符。