我目前正在使用套接字进行多人游戏,并且在登录时遇到了一些问题。C++套接字,发送和recv不同步
这里的服务器功能 - 线程从用户收到的消息涉及:
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”,但不会输入if,直到下一个循环结束。因为它再次循环它变成“taigi100”(我使用的用户名),然后它进入如果它甚至不应该。
解决此问题的一种方法是制作send-recv系统,以便在获得一些反馈之前不发送任何其他内容。
我想知道是否有其他解决此问题的快速方法,以及为什么发生这种奇怪的行为。
在实施它之前,请大步退一步并记录协议。这将为您节省大量未来的痛苦。如果您不确定如何执行此操作,请查看TCP上分层的其他协议(例如SMTP,HTTP或IRC)的文档。 – 2014-09-30 16:36:25