我正在进行多人游戏,但我遇到了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.
我可能是瞎子,不知道错误在哪里,但是在2小时后厌倦了看它。如果有人能指出我正确的方向,那就太好了。
根据评论进行修改:
我检查了发送功能(也编辑了代码),控制台保持清洁,因此发送功能正常工作。
奇怪的是,当我第一次添加时,如果我忘记了{}并且它进入了其他地方。客户端recv用于第二次发送(send(sConnect,“0x0002”,6,0);)
由于回答而编辑
在客户端构造函数中,用户名和密码都被选中,因此服务器端的recv和客户端的发送都可以正常工作。
自从第二个工作以来,它首先在服务器端发送。
由于评论而编辑&amp;&amp;回答#2
由于Remy的回答我实际上发现我的Client构造函数中有一个错误,我修复了它。现在两个发送的brenches都不起作用:)。
这基本上是游戏的登录,客户端输入用户名和密码并将它们发送到服务器。然后根据密码和用户名是否正确的事实创建used。 GetLogInSuccesful只是从客户端函数返回一个bool,告诉我密码和用户名是否正确。
由于解决问题进行编辑
看起来有使用recv函数的anthoner线程,并且发送是由其他recv采取的...我讨厌这样的愚蠢错误。 Thnx提供所有帮助和建议!
答案 0 :(得分:2)
您假设recv
一次返回所有字节。它也可以合法返回一个字节。有关问题的更完整描述,请参阅this answer。
此问题会影响所有TCP初学者。
答案 1 :(得分:1)
如果GetLogInSuccessful()
失败,您需要发送回复:
if( ...->GetLogInSuccesful() )
send(sConnect,"0x0001",6,0);
else
send(sConnect,"0x0000",6,0);