2011-06-16 150 views
1

我有這個while循環和這段代碼工作。問題是,如果我減小了緩衝區大小併發送比緩衝區大的數據,它將分別接收數據。例如,如果我發送170個字節(100字節緩衝區),那麼它將讀取前100個字節,並再次讀取70個字節。處理這個問題的最好方法是什麼?如果多個用戶發送這樣的數據,那我該如何連接這些分離的數據包?在此先感謝..epoll的閱讀問題

while(m_severRun){ 
    int event_cnt = epoll_wait(m_epfd, m_events, EPOLL_SIZE, -1); 
    if(event_cnt == -1){ 
     perror("epoll_wait error \n"); 
     break; 
    } 

    for(int i=0; i<event_cnt; i++){ 
     if(m_events[i].data.fd == m_serverSock){ 

      printf("ServerManager::eventAcceptLoop, A Client has been connected \n"); 

      struct sockaddr_in clnt_adr; 
      socklen_t adr_sz = sizeof(clnt_adr); 


      int clnt_sock = accept(m_serverSock, (struct sockaddr*)&clnt_adr, &adr_sz); 
      if(!addClient(clnt_sock)) 
       break; 
     } 
     else{ 

      int str_len = read(m_events[i].data.fd, buf, BUF_SIZE); 
      printf("read %d \n", str_len); 

      if(str_len == 0){ 
       if(!removeClient(m_events[i].data.fd)) 
        break; 
       close(m_events[i].data.fd); 

      } 
      else { 
       printf("ServerManager::eventAcceptLoop, A message has been received \n"); 
       //pushWork(buf); 
       //write(m_events[i].data.fd, buf, str_len); 
      } 
     } 
    }//for loop end 
}//while loop end 

回答

1

好吧,雖然這是不可能的,有可能是你的170個字節的客戶端發送可以在你的服務器到達,並呈現爲170閱讀()爲1。str_len這只是返回TCP是如何 - 它流式傳輸字節。如果您必須將字節連接成某種協議單元,那麼您必須在代碼中明確執行此操作。您的應用程序的最佳方式取決於協議以及您如何處理協議單元。這非常依賴於應用程序。例如,如果您的協議是CRLF分隔的文本,則可以將每個接收到的字節複製到某個緩衝區類中,直到找到分隔符爲止,然後再pushwork(currentBufferInstance)。

這一切都取決於您的協議以及您希望/需要如何在服務器之間傳輸數據。

Rgds, Martin