C++ Winsock2 接收垃圾
C++ Winsock2 recv junk
所以我正在写一个 Windows 聊天,出于测试目的,我的客户端程序每 300 毫秒向服务器发送一条 "hello" 消息。
前几条消息还不错,但后来无缘无故地开始变成垃圾-
显然我想修复它并寻求您的帮助 :) 这是我的代码:
发送函数:
bool Target::Send(char *message)
{
int length = strlen(message);
int result = send(this->ccSock, (char*)&length, sizeof(int), 0);
if (result <= 0)
return false;
Sleep(10);
result = send(this->ccSock, message, length, 0);
return ((result > 0) ? true : false);
}
接收函数:
Message Server::Receive(SOCKET socket)
{
int length = 0;
int result = recv(socket, (char*)&length, sizeof(int), 0);
Sleep(10);
char *rcvData = new char[length];
result = recv(socket, rcvData, length, 0);
return { rcvData, result };
}
消息结构:
struct Message {
char *msg;
int size;
};
主发送码:
while (true)
{
if (!target->Send("hello"))
{
cout << "Connection broken\n";
target->Clean();
break;
}
Sleep(300);
}
主要接收码:
while (target.sock)
{
Message message = server->Receive(target.sock);
if (message.size > 0)
cout << message.msg << " (" << message.size << ")\n";
else
{
cout << "Target disconnected\n";
server->Clean();
break;
}
Sleep(1);
}
非常感谢您的帮助以及解释为什么会这样!
您的缓冲区不是空终止的。因此,当您尝试使用 std::cout
打印它时,会发生缓冲区溢出。接收码的正确版本应该是:
char *rcvData = new char[length+1];
result = recv(socket, rcvData, length, 0);
rcvData[length] = '[=10=]';
此外,您永远不会释放分配的内存缓冲区,因此您的代码会在每次 Receive
调用时泄漏它。
所以我正在写一个 Windows 聊天,出于测试目的,我的客户端程序每 300 毫秒向服务器发送一条 "hello" 消息。
前几条消息还不错,但后来无缘无故地开始变成垃圾-
显然我想修复它并寻求您的帮助 :) 这是我的代码:
发送函数:
bool Target::Send(char *message)
{
int length = strlen(message);
int result = send(this->ccSock, (char*)&length, sizeof(int), 0);
if (result <= 0)
return false;
Sleep(10);
result = send(this->ccSock, message, length, 0);
return ((result > 0) ? true : false);
}
接收函数:
Message Server::Receive(SOCKET socket)
{
int length = 0;
int result = recv(socket, (char*)&length, sizeof(int), 0);
Sleep(10);
char *rcvData = new char[length];
result = recv(socket, rcvData, length, 0);
return { rcvData, result };
}
消息结构:
struct Message {
char *msg;
int size;
};
主发送码:
while (true)
{
if (!target->Send("hello"))
{
cout << "Connection broken\n";
target->Clean();
break;
}
Sleep(300);
}
主要接收码:
while (target.sock)
{
Message message = server->Receive(target.sock);
if (message.size > 0)
cout << message.msg << " (" << message.size << ")\n";
else
{
cout << "Target disconnected\n";
server->Clean();
break;
}
Sleep(1);
}
非常感谢您的帮助以及解释为什么会这样!
您的缓冲区不是空终止的。因此,当您尝试使用 std::cout
打印它时,会发生缓冲区溢出。接收码的正确版本应该是:
char *rcvData = new char[length+1];
result = recv(socket, rcvData, length, 0);
rcvData[length] = '[=10=]';
此外,您永远不会释放分配的内存缓冲区,因此您的代码会在每次 Receive
调用时泄漏它。