2014-05-04 157 views
0

我已經搜索論壇,但無法找到適合我的問題的正確答案。我要做一個小登錄過程,所以我想發送數據在編輯框作爲登錄,然後發送數據在第二編輯框作爲密碼。winsock2發送和接收

int ldata2 = send(Socket, buffs, len, 0);//send login via socket 
//send pass via socket 
int passData = send(Socket, buffPass, lenPass, 0); 

以上說明由客戶處理。就當我們可以調用recv即這樣的服務器端:如果在登錄,編輯框是「日誌」:

int dt = recv(SocketM[i], 
             strings, 
             128, 
             0); 

         int errsock = WSAGetLastError(); 
         if(errsock != WSAEWOULDBLOCK && errsock != 0) 
         { 
          std::cout << "ERR CODE " << errsock; 
          //shutdown(SocketM[Client]); 
          closesocket(SocketM[Client]); 
          break; 
         } 
         int passdt = recv(SocketM[i], 
              passstrings, 
              128, 
              0); 
         std::cout << strings << std::endl;//Log and Password in the same buff :(
         std::cout << passstrings //nothing in buffer why? 

我從buffPass愛好者和數據,而不是僅僅從愛好者的exaple字符串值數據得到並在通過編輯框 - 「通過」我得到LogPass 但我希望從日誌單獨的數據到一個字符串和數據從傳遞到第二。請幫我 請幫幫我。

+0

如果你不想要一個'recv()'中的所有數據,你爲什麼要求長度爲128? –

+0

有沒有辦法在服務端獲得我的緩衝區長度?第三個參數中的recv函數請求緩衝區長度,但我該如何設置? – ak44

+0

發送方知道緩衝區的長度,接收方需要它。兩種方式來做到這一點。選項1 - 定長消息,填充佔用未使用的部分(但要小心填充零填充或其他內容,不要將隨機數據留在那裏,請參閱「Heartbleed」以瞭解爲什麼這很重要)。選項2 - 在數據前面發送長度(EJP在他的回答中提到了長度前綴)。在選項#2中,長度本身是固定大小的,所以問題不會被緩解。 –

回答

1

TCP是一種字節流協議。如果你想分開消息,你可以這樣做,通過分隔符,長字前綴,自描述協議如XML,類型長度值協議......

注意它不是' t有效檢查WSAGetLastError(),除非出現錯誤:即在此情況下,如果recv()返回-1。

+1

在檢查錯誤代碼之前調用其他API函數(如「Sleep」)也不是一個好主意。 –