我正在制作一个多人游戏,我对recv函数(或者发送函数,不确定)有一个问题。
服务器端代码:
char* UserName = new char[256];
ZeroMemory(UserName,256);
recv(sConnect,UserName,256,0);
char* Password = new char[256];
ZeroMemory(Password,256);
recv(sConnect,Password,256,0);
users[ ++usercount ] = new Client(UserName,Password,sConnect);
if( users[usercount] ->GetLogInSuccesful() )
{
if( send(sConnect,"0x0001",6,0) == 0)
cout << "THIS IS **** UP";
}
else
{
usercount--;
send(sConnect,"0x0002",6,0);
}客户端代码:
send(server->getsConnect(),User,256,0); // works
send(server->getsConnect(),Pass,256,0); // works
char* Response = new char[6];
ZeroMemory(Response,6);
recv(server->getsConnect(),Response,6,0); // gets stuck here.我可能是瞎了,不知道哪里是错误,但厌倦了看了两个小时后。如果有人能给我指明正确的方向,那就太好了。
基于评论的编辑:
我已经检查了发送函数(也编辑了代码),控制台保持干净,因此发送函数工作正常。
问题是,当我第一次添加如果我忘记了{},它进入了其他。客户端recv用于第二次发送( send(sConnect,“0x0002”,6,0));
编辑由于answere
在客户端构造函数中,用户名和密码都会被检查,因此服务器端的recv和客户端的发送都能很好地工作。
这仅仅是关于第一个发送服务器端,因为第二个工作。
编辑由于评论和答案#2
由于雷米的回答,我实际上发现我的客户端构造器中有一个bug,我修复了它。现在,发送的两条腿都不起作用:)。
这基本上是一个游戏的登录,客户端输入用户名和密码并将它们发送到服务器。然后根据密码和用户名是否正确这一事实创建一个used。GetLogInSuccesful只是从客户端函数返回一个bool,它告诉我密码和用户名是否正确。
解决问题的编辑
看起来有一个使用recv函数的蒽线程,而这个发送是由另一个recv.我讨厌这些愚蠢的错误。感谢所有的帮助和建议!
发布于 2013-10-18 14:58:46
假设recv一次返回所有字节。它也可以合法地返回一个字节。有关此问题的更完整描述,请参考this answer。
这个问题影响到所有TCP初学者。
发布于 2013-10-18 14:55:46
如果GetLogInSuccessful()失败,则需要发送响应:
if( ...->GetLogInSuccesful() )
send(sConnect,"0x0001",6,0);
else
send(sConnect,"0x0000",6,0);https://stackoverflow.com/questions/19452509
复制相似问题