Read () застрял при попытке прочитать файл - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть файл контрольных точек, который получает состояние сервера.Это состояние представляет сериализованные команды, которые проходят через мою сеть.

Я пытаюсь прочитать файл, но он застревает в цикле чтения в то время.

Моя функция чтения:

struct message_t *pmanager_readop(int fd){
    if (fd < 0) return NULL;

    // Variables
    char *buffer = NULL;
    int result, msg_size;
    struct message_t *msg;

    // Check if file has data
    lseek (fd, 0, SEEK_END);
    int size_ckp = lseek(fd, 0, SEEK_CUR);

    if (size_ckp <= 0)
        return NULL;

    // Read message size
    result = read_all(fd, (char *) &msg_size, 4);
    if (result < 0) {
        return NULL;
    }
    msg_size = ntohl(msg_size);
    // ............

Моя функция read_all ():

int read_all(int sock, char *buf, int len){
    int bufsize = len;
    while(len > 0){
        int res = read(sock,buf,len);

        if(res < 0){
            if (errno == EINTR) continue;
            return res;
        }
        buf += res;
        len -= res;
    }
    return bufsize;
}

Я использую эту же функцию для чтения данных из моего соединения сервер / клиент с той же сериализацией и форматом, но с дескриптором сокета, и она отлично работает.

1 Ответ

0 голосов
/ 25 ноября 2018

Вы должны обработать случай, когда read() возвращает 0, сообщая вам, что другая сторона закрывает соединение, если читает из дескриптора сокета, или EOF встречается, если читает из файлового дескриптора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...