Я пытаюсь реализовать функцию 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(...)
произойдет?