Как реализовать сокет readAll - PullRequest
       48

Как реализовать сокет readAll

0 голосов
/ 06 февраля 2020

Я пытаюсь реализовать функцию readAll и сигнал readyRead, которые ожидают, что будут работать так же, как QTcpSocket :: readAll и QTcpSocket :: readyRead .

Это я пытался.

Событие Epoll l oop с неблокирующим сокетом

// below run when epoll event(EPOLLIN) is triggered
int ready_read_size;
ioctl(fd, FIONREAD, &ready_read_size);
if (ready_read_size < 0) {
    // error
} else if(ready_read_size == 0) {
    // socket closed?
} else {
    // ready to read
    ready_read(fd, ready_read_size); // call the ready_read() callback
}

Реализация

typedef std::vector<uint8_t> Bytes;

Bytes read_all(int sfd, int size)
{
    Bytes buffer(size);
    int r = read(sfd, buffer.data(), size);
    if (r != size) {
        // error
    }
    return buffer;
}

void ready_read(int sfd, int size)
{
    Bytes read = read_all(sfd, size);
    //Further application process with read data... 
}
  • Это дизайн правильный?
  • Когда ready_read_size == 0, это то же самое, что read(...) == 0? означает, что розетка отключена.
  • Возможно, что ready_read_size != read(...) произойдет?
...