【发布时间】:2014-11-25 06:44:08
【问题描述】:
我目前正在使用套接字开发多人游戏,但在登录时遇到了一些问题。
这是服务器函数 - 处理来自用户的传入消息的线程:
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);
}
}
我将尽可能简单地解释这一点。服务器端函数中 while(true) 的第一个 recv 函数首先接收“StartLogIn”,但直到下一个 while 循环才进入 if。因为它再次循环,所以它更改为“taigi100”(我使用的用户名),然后它进入 if 即使它不应该。
解决此问题的一种方法是创建一个发送-接收系统,以便在收到反馈之前不发送任何其他内容。
我想知道是否有任何其他快速解决此问题的方法以及为什么会发生这种奇怪的行为。
【问题讨论】:
-
在实施协议之前,请退后一步并记录协议。这将在未来为您节省大量的痛苦。如果您不确定如何执行此操作,请查看位于 TCP 之上的其他协议(例如 SMTP、HTTP 或 IRC)的文档。
标签: c++ sockets networking