2011-06-16 93 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