从函数返回的C++问题

C++ problems returning from a function

本文关键字:C++ 问题 返回 函数      更新时间:2023-10-16

我制作了一个供个人使用的服务器应用程序,但当客户端断开连接时,我总是会遇到问题。我最近才意识到,这是由于recv函数返回的项没有被正确识别造成的。例如:

char* mrecv(bool show, LPVOID pointerToObject) //Recieve a message
{
    int iResult2 = recv(ClientSocket, recvbuf, 512, 0);
    if (iResult2 > 0) {
        if ((strncmp(recvbuf,"/",1)) != 0) {
            printm(recvbuf, pointerToObject);
       }
    else if (iResult2 == 0) {
        printf("Connection closing...n");
        closesocket(ClientSocket);
        WSACleanup();
        return "1";
    }
    else  {
        printm("recv failed with error: %dn", WSAGetLastError());
        printm("Client must have disconnected. Please select a new client.");
        return "1";
    }
    return recvbuf;
}

当客户端断开连接时,函数将正确地向父函数返回"1"。然而,当我这样检查时…:

DWORD WINAPI recvfunc(LPVOID pointerToObject)
{
    while (true) {
        ClientSocket=client[currentclient].cs;
        char* p = mrecv(true, pointerToObject);
        std::cout<<p<<"n";
        if ( p == "1") {
            client[currentclient].con=false;
            ClientSocket=client[lastclient].cs;
            return 1;
        }
    }
    return 0;
}

无论检查是否返回"1"if语句都返回false,但是1完美地打印到屏幕上。

有人知道为什么会发生这种事吗?

如果你没注意到的话,我在用winsock。

提前感谢:)

编辑::截至本次编辑,以下所有答案似乎都是一样的,它们都解决了问题。如果你看看上面列出的第一个函数^,你会发现我以前甚至遇到过这个问题,不得不使用这个解决方案。所以看起来我的大脑有点放弃了我。无论如何,谢谢你的帮助。:)

您的mrecv返回类型为char*的结果。

您的比较:

if (mrecv(true, pointerToObject)=="1")

是指针比较,而不是字符串比较。只有当字符串"1"的两个实例碰巧存储在同一地址时,这才是真的。

要比较字符串,请使用strcmp函数。或者,由于您使用的是C++,请考虑使用std::string类(它有一个重载的==函数来进行字符串比较),而不是使用原始的C样式字符串。

尝试:

if (strcmp(mrecv(true, pointerToObject), "1") == 0)

您返回的是指向只读字符文本的指针,这些地址在进行比较时是不可靠的。

您可以使用strcmp或任何其他C++字符串比较进行字符串比较

if ( strcmp(p,"1") == 0) { ...

您正在比较字符指针,不能保证一个指针与另一个指针相等:

试试这个:

if (mrecv(true, pointerToObject)[0] == '1')

现在,您正在将mrecv返回的第一个字节与字符1进行比较。

但是,我强烈建议您返回整数返回代码,而不是字符。

您的问题是,不能以这种方式将==运算符用于C样式字符串(char数组),因为要比较的不是字符串的内容,而是指向第一个字符的指针的值,因为您实际上是在比较char*和char*。如果你想比较实际值,你需要取消引用返回的指针,并将其与字符值而不是字符串进行比较(单引号而不是双引号):

if (*mrecv(true, pointerToObject) == '1') {