gpt4 book ai didi

C++ 套接字,发送和接收不同步

转载 作者:行者123 更新时间:2023-11-28 00:23:44 26 4
gpt4 key购买 nike

我目前正在使用套接字开发多人游戏,但在登录时遇到了一些问题。

这是服务器函数 - 处理来自用户的传入消息的线程:

void Server::ClientThread(SOCKET Connection)
{
char *buffer = new char[256];

while (true)
{
ZeroMemory(buffer,256);
recv(Connection, buffer, 256, 0);
cout << buffer << endl;
if (strcmp(buffer, "StartLogIn"))
{
char* UserName = new char[256];
ZeroMemory(UserName, 256);
recv(Connection, UserName, 256, 0);

char* Password = new char[256];
ZeroMemory(Password, 256);
recv(Connection, Password, 256, 0);

cout << UserName << "-" << Password << " + "<< endl;
if (memcmp(UserName, "taigi100", sizeof(UserName)))
{
cout << "SMB Logged in";
}
else
cout << "Wrong UserName";
}

int error = send(Connection, "0", 1, 0);
// error = WSAGetLastError();
if (error == SOCKET_ERROR)
{
cout << "SMB D/Ced";
ExitThread(0);
}
}
}

这是将数据从客户端发送到服务器的函数:

if (LogInButton->isPressed())
{
send(Srv->getsConnect(), "StartLogIn", 256, 0);
const wchar_t* Usern = UserName->getText();
const wchar_t* Passn = Password->getText();
stringc aux = "";
aux += Usern;
char* User = (char*)aux.c_str();

stringc aux2 = "";
aux2 += Passn;
char* Pass = (char*)aux2.c_str();

if (strlen(User) > 0 && strlen(Pass) > 0)
{
send(Srv->getsConnect(), User, 256, 0);
send(Srv->getsConnect(), Pass, 256, 0);
}
}

我将尝试尽可能简单地解释这一点。 Server 端函数中while(true) 的第一个recv 函数首先接收“StartLogIn”,但直到while 的下一个循环才进入if。因为它再次循环,所以它更改为“taigi100”(我使用的用户名),然后它进入 if 即使它不应该。

解决此问题的一种方法是制作一个发送-接收系统,以便在收到一些反馈之前不发送任何其他内容。

我想知道是否有任何其他快速方法可以解决这个问题,以及为什么会出现这种奇怪的行为。

最佳答案

它充满了错误。

  • 您对 new[] 的过度使用。好的,这不是错误,但您没有删除其中任何一个,您可以使用本地堆栈缓冲区空间或 vector< char >

  • 您需要始终检查对 recv 的任何调用的结果因为您不能保证收到您期望的字节数。您指定的数字是缓冲区的大小,而不是您期望获得的字节数。

  • strcmp 如果字符串匹配,则返回 0,如果不匹配,则返回非零(实际上是 1 或 -1,取决于它们是比较小还是比较大)。但您似乎使用非零来表示相等。

  • 不确定 stringc 是什么。从宽字符串到字符串的某种转换?无论如何,我认为 send 是 const-correct,所以没有必要放弃 constness。

  • 发送的第三个参数是您要发送的字节数,而不是缓冲区的容量。用户名和密码可能不是 256 字节。不过,您需要将它们作为“数据包”发送,以便接收方知道他们收到了什么,并且会知道他们何时收到完整的数据包。例如发送类似“User=vandamon\0”的字符串。 (而且你还需要检查它的返回值)

关于C++ 套接字,发送和接收不同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26124204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com