2

我正在制作一款多人游戏,但我的 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 小时后看厌了。如果有人能指出我正确的方向,那就太好了。

由于评论而编辑:

我检查了发送功能(也编辑了代码),控制台保持清洁,因此发送功能正常工作。

奇怪的是,当我第一次添加 if 时,我忘记了 {},它进入了 else。客户端 recv 用于第二次发送( send(sConnect,"0x0002",6,0); )

由于回答而编辑

在客户端构造函数中,用户名和密码都被检查,因此服务器端的接收和客户端的发送都可以正常工作。

由于第二次有效,这只是服务器端的第一次发送。

由于评论和答案而编辑#2

由于 Remy 的回答,我实际上发现我的 Client 构造函数中有一个错误,我修复了它。现在发送的两个分支都不起作用:)。

这基本上是游戏的登录,客户端输入用户名和密码并将它们发送到服务器。然后根据密码和用户名的正确与否创建一个 used。GetLogInSuccesful 只是从客户端函数返回一个布尔值,告诉我密码和用户名是否正确。

由于求解而编辑

看起来有一个使用recv函数的anthoner线程,并且发送被另一个recv接收了......我讨厌这种愚蠢的错误。感谢所有的帮助和建议!

4

2 回答 2

2

您假设recv一次返回所有字节。它也可以合法地只返回一个字节。有关问题的更完整描述,请参阅此答案

这个问题困扰着所有 TCP 初学者。

于 2013-10-18T14:58:46.370 回答
1

GetLogInSuccessful()如果失败,您需要发送响应:

if( ...->GetLogInSuccesful() )
    send(sConnect,"0x0001",6,0);
else
    send(sConnect,"0x0000",6,0);
于 2013-10-18T14:55:46.517 回答