Проблема чтения с epoll - PullRequest
1 голос
/ 16 июня 2011

У меня есть цикл 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

1 Ответ

1 голос
/ 16 июня 2011

Ну, хотя это маловероятно, возможно, что ваша 170-байтовая клиентская посылка могла бы прибыть на ваш сервер и быть представлена ​​как 170 read () возвращает с str_len, равным 1. Это просто, как TCP - он передает байты. Если вам нужно объединить байт в какой-то блок протокола, то вам придется явно сделать это в своем коде. Лучший способ для вашего приложения зависит от протокола и от того, как вы обрабатываете единицы протокола. Это очень зависит от приложения. Если, например, ваш протокол представляет собой текст с разделителями CRLF, вы можете скопировать каждый полученный байт в некоторый буферный класс до тех пор, пока не будет найден разделитель, затем pushwork (currentBufferInstance).

Все зависит от вашего протокола и того, как вы хотите / должны передавать ваши данные по вашему серверу.

Rgds, Martin

...