2011-03-07 210 views
0

我想從客戶端發送一些文本到服務器。 我也想顯示時間戳,以便通知收到消息的時間。 當我嘗試發送時間它發送一個空白。但字符串的其餘部分得到顯示。客戶端服務器 - (TCP)

這裏我從客戶端發送代碼:

void ClientSock::OnConnect(int nErrorCode) 
{ 
    // TODO: Add your specialized code here and/or call the base class 
    if(nErrorCode) 
    { 
     AfxMessageBox(_T("Connection Failure.")); 
     Close(); 
    } 
    else 
    { 
     time_t clock; 
     time(&clock); 
     char min[30] = {0}; 
     char s = ctime_s(min,sizeof(min),&clock); 
     char text[100] = {0}; 
     char user[10] = {"UserName"}; 
     int n = m_pDlg->GetDlgItemText(ID_REQUEST,text, 100); 
     Send(text,n); 
     Send(user,sizeof(user)); 
     Send(min,sizeof(min)); 
     //m_pDlg->SetDlgItemText(ID_REQUEST,min); 
     AfxMessageBox(_T(min)); 
    } 

} 

和繼承人如何在服務器的控制檯即時打印:

    SOCKET client; 
      char text[100] = {0}; 
      char user[10] = {0}; 
      char min[30] = {0}; 
      int n,m; 
      //(here the server waits for the client and accepts connection requests) 
      client = accept(server, NULL, NULL); 
      //(receiving text from the client) 

      n = recv(client, text, 99, 0);   
      recv(client, user, 9, 0);  
      m = recv(client, min, 29, 0);  

      if(n > 0 && m > 0) 
      { 
       printf("%s:: %s:%s\n",min,user,text); 
      }    
      else 
       printf("ERROR:Communication Failure.\n"); 

回答

1

一個TCP連接應被視爲字節流。您將它視爲具有類型信息的對象流。

在您的3次發送之後,已經傳輸的字節將是例如。

ABC \ 0UserName \ 0 \ 0Time \ 0 - 總共19個字節。

然後,您讀取99個字節,並將所有數據存儲到「文本」中,並且在您的下一次讀取中沒有任何內容留在流中。

您需要在文本本身之前發送文本的長度,或者您需要在接收端讀取「數據」並掃描例如一個0結束符來提取流的3個邏輯元素。

+0

當我發送文本。它顯示::用戶名:文本。它不打印時間。 – Pavitar 2011-03-07 13:13:11

+0

再次閱讀我的答案,它告訴你爲什麼。 – Erik 2011-03-07 13:14:34

+0

非常感謝你+1。在對我的代碼進行了一些實驗後,現在我明白了你的意思。 :) – Pavitar 2011-04-20 04:37:30