Recv方法用法

时间:2013-10-18 14:44:33

标签: c++ windows sockets networking

我正在进行多人游戏,但我遇到了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提供所有帮助和建议!

2 个答案:

答案 0 :(得分:2)

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

此问题会影响所有TCP初学者。

答案 1 :(得分:1)

如果GetLogInSuccessful()失败,您需要发送回复:

if( ...->GetLogInSuccesful() )
    send(sConnect,"0x0001",6,0);
else
    send(sConnect,"0x0000",6,0);