2011-03-07 211 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