首页 > 解决方案 > 如何实现socket readAll

问题描述

我正在尝试实现与QTcpSocket::readAllQTcpSocket::readyReadreadAll相同的功能和readyRead信号。

这是我试过的。

使用非阻塞套接字的 Epoll 事件循环

// 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... 
}

标签: c++socketsposixepoll

解决方案


推荐阅读