2010-10-13 72 views
1

我正在學習如何使用c/C++網絡程序,並且我已經創建了一個服務器(TCP),它假設以特定方式響應來自客戶端的消息以執行此操作創建了一個服務器類將消息傳遞給該類並返回一個字符串以返回給客戶端的類。在Linux中的C++網絡編程:服務器問題

這是我的問題有時它會報告正確的字符串回其他時間,如果只是重複我發送到消息處理程序。哪裏沒有在代碼中我有它返回什麼傳入。所以我想知道我處理正確的消息?

其次,我不確定如何在while循環中保持連接打開以不斷地來回傳遞消息。你可以在下面的代碼中看到我是如何做到的,但我確信這是不正確的,任何幫助都會很棒。謝謝!

if (!fork()) 
    { // this is the child process 
     close(sockfd); // child doesn't need the listener 

     while ((numbytes = recv(new_fd, buf, MAXDATASIZE-1, 0)) > 0) 
     { 
      //numbytes = recv(new_fd, buf, MAXDATASIZE-1, 0); 

      buf[numbytes-1] = '\0'; 
      const char* temp = ash.handleMessage(buf).c_str(); 
      int size_of_temp = ash.handleMessage(buf).length(); 
      send(new_fd, temp, size_of_temp, 0); 

      //send(new_fd, temp, size_of_temp+1, 0); 
     } 
    }//end if 

請原諒我的貧民區代碼

Handles the message

Class Method handler uses

+0

好吧,我們不知道你在recv和send之間做了什麼。給我們更多的細節! – slezica 2010-10-13 14:03:10

+0

等一下,我重新閱讀你的問題,問題是它有時候會像字符串一樣迴應字符串,有時它會發送另一個你希望它發送的處理後的迴應?如果是這樣,那麼問題是在處理程序,而不是在這段代碼... – slezica 2010-10-13 14:05:46

+0

我已經測試處理程序和處理程序使用相當廣泛的方法。我會張貼它,所以你可以看到。 – Pieces 2010-10-13 14:12:01

回答

1

您打給handleMessage兩次。您沒有發佈代碼,但看起來您正在返回string。這可能是更好的事情可做:

 string temp = ash.handleMessage(buf); 
     int size_of_temp = temp.length(); 

這將避免重複,發生在handleMessage任何行動。

+0

是的,我在你說什麼之前切換了這個,但是這個問題不知道爲什麼調用它兩次會做到這一點,但也不知道爲什麼我首先把它稱爲糟糕的。在飢餓的情況下工作5個小時以上的代碼可能是一個原因。謝謝 – Pieces 2010-10-13 17:29:17

+0

它也可能與懸掛指針指向臨時對象然後被銷燬有關。再看看'handleMessage()'中的代碼。 – bstpierre 2010-10-13 18:55:09

2

如果您對插座的學習,你也應該知道,你不能想當然地認爲你發送的()爲「完整信息「,將作爲完整信息發送。

如果您從客戶端發送()一些大數據,則可能需要在服務器上使用多個recv()(反之亦然)才能將其全部讀取。這是文件通常工作的一個很大的區別...

如果你正在設計自己的協議,你可以選擇發送消息長度,如[LEN] [消息]。一個簡單的例子是,如果您發送的限制爲256個字節的字符串您可以發送啓動()荷蘭國際集團一代表字符串長度,

或更容易,決定你用線飼料(換行符 - \ n)終止消息。該協議將類似於

「MSG 1 \ nmsg2 \ n」個

,那麼你就必須的recv(),並追加數據,直到你得到一個換行符。這就是我現在所能想到的,互聯網上有很多很棒的例子,但我會建議找到一些「真正的」程序的來源,看看它如何處理它的網絡。

+0

也不要假設send()可以發送你的整個消息,你必須在一個循環中調用send(),直到所有的數據都被髮送出去爲止 – 2010-10-13 14:13:34

+0

是的,我的協議很短,我只是測試它馬上。如果你不介意給我一些好的代碼示例的鏈接。我只能找到迴應服務器/客戶端的例子,這些例子並沒有真正幫助那麼多。 – Pieces 2010-10-13 14:19:57

+0

它也可以用另一種方式工作,如果使用10次send()調用發送10條消息,則可以通過一次recv()調用讀取其中的9個半數。 – nos 2010-10-13 16:21:17