1

我有这个while循环,这个代码正在工作。问题是,如果我减小了缓冲区大小并发送比缓冲区大小更大的数据,它会单独接收数据。例如,如果我发送 170 字节(100 字节缓冲区),那么它会读取前 100 字节,然后再次读取 70 字节。处理这个问题的最佳方法是什么?如果多个用户发送这样的数据,那么我如何连接这些分离的数据包?提前致谢..

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
4

1 回答 1

1

好吧,虽然这不太可能,但您的 170 字节客户端发送可能会到达您的服务器并显示为 170 read() 返回,str_len 为 1。这就是 TCP 的方式 - 它流式传输字节。如果您必须将字节连接到某种协议单元中,那么您必须在代码中明确执行此操作。您的应用程序的最佳方式取决于协议以及您如何处理协议单元。这非常依赖应用程序。例如,如果您的协议是 CRLF 分隔的文本,您可以将每个接收到的字节复制到某个缓冲区类中,直到找到分隔符,然后 pushwork(currentBufferInstance)。

这完全取决于您的协议以及您希望/需要如何在服务器周围通信数据。

Rgds,马丁

于 2011-06-16T13:06:04.453 回答