从函数返回的C ++问题

时间:2014-08-28 19:29:51

标签: c++ return

我已经为自己个人使用了一个服务器应用程序,但是当客户端断开连接时我总是遇到问题。我刚刚意识到这是由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: %d\n", 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;
}

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

任何人都知道为什么会这样?

如果你没有注意到,我正在使用winsock。

提前致谢:)

EDIT :: 这个编辑的所有下面的答案似乎都是一样的,他们都解决了这个问题。如果你看看那里列出的第一个函数^,你会发现我之前显然遇到过这个问题并且不得不使用这个解决方案。所以看起来我的大脑有点放弃了我。无论如何,感谢所有的帮助。 :)

5 个答案:

答案 0 :(得分:4)

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

您的比较:

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

是指针比较,而不是字符串比较。仅当字符串"1"的两个实例恰好存储在同一地址时才是真的。

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

答案 1 :(得分:2)

尝试:

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

您正在比较char指针,并且无法保证一个指针与另一个指针相等:

试试这个:

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

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

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

答案 4 :(得分:0)

你的问题是你不能以这种方式使用带有C风格字符串(char数组)的==运算符,因为被比较的不是字符串的内容,而是指向第一个字符的指针的值因为你真的把char *比作char *。如果要比较实际值,则需要取消引用返回的指针,并将其与字符值进行比较,而不是字符串文字(单引号而不是双引号):

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