我目前正在使用套接字進行多人遊戲,並且在登錄時遇到了一些問題。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