2014-08-28 69 views
0

我为自己的个人使用制作了一个服务器应用程序,但是当客户端断开连接时,我总是遇到问题。我最近才意识到这是由recv函数返回的项目无法正确识别而引起的。 例如:从函数返回的C++问题

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”正确地连接到母体功能。然而,当我检查它所以...:检查是否返回"1",但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。

任何人都知道为什么会发生这种情况?

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

感谢提前:)

编辑:: 下面所有的答案,因为这编辑的似乎是同样的事情,他们都不能解决问题。如果你看看那里列出的第一个函数^,你会发现我显然甚至在之前遇到过这个问题,不得不使用这个解决方案。所以它看起来像我的大脑只是放弃了我。无论如何,感谢所有的协助。 :)

回答

4

mrecv返回char*类型的结果。

您的比较:

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

是一个指针的比较,而不是一个字符串比较。只有在字符串"1"的两个实例恰好存储在相同地址的情况下才是如此。

要比较字符串,请使用strcmp函数。或者,因为您使用的是C++,所以请考虑使用std::string类(它有一个重载的==函数,它可以进行字符串比较),而不是使用原始C风格的字符串。

2

尝试:

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

哦,我的。非常感谢你。我记得在我的项目的早些时候必须使用该解决方案,但它完全放弃了我的想法。 我现在就试试看,但我几乎肯定这是解决方案。 – Phixle 2014-08-28 19:34:20

+0

等一下......这就是我列在那里的第一个功能。 -.- 恩......对不起人。我猜想我的脑子里有点爆炸。 – Phixle 2014-08-28 19:35:14

0

你返回指针为只读字符文字,这些地址是不可靠的比较,因为你在干什么。

你可能会去使用strcmp字符串比较或任何其他C++字符串比较

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

你是比较字符指针,而且也不能保证一个指针将等于其他:

试试这个:

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

您现在比较受mrecv回到第一个字节字符1

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

0

你的问题是,你不能用C风格的字符串(char数组)的方式使用==操作符,因为比较的内容不是字符串的内容,而是指向第一个字符,因为你真的比较了char *和char *。如果要比较的实际值,则需要取消引用返回的指针,并把它比作一个字符值,而不是一个字符串(单引号代替双):

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

做'mrecv(true,pointerToObject)[0]'可能会更具可读性,并且更明显的是你正在处理一个C-String – scohe001 2014-08-28 20:14:15