2014-08-28 73 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