c++ - 如何实现socket readAll
问题描述
我正在尝试实现与QTcpSocket::readAll和QTcpSocket::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...
}
- 这个设计正确吗?
- 什么时候
ready_read_size == 0
,是一样的read(...) == 0
吗?表示套接字已断开连接。 - 有可能发生这种
ready_read_size != read(...)
情况吗?
解决方案
推荐阅读
- python - 如何使用预训练的 keras 模型作为模型添加函数的参数?
- javascript - 鼠标移动太快并触发其他按钮功能 - JavaScript
- laravel - Laravel Nova Metrics Partition belongsToMany 关系
- django-models - f字符串插值语法错误python3.6
- react-native - 如何在 React Navigation Stacknavigator 中制作自定义 HeaderTitle?
- javascript - Chrome 扩展程序显示启用/禁用扩展程序的切换
- ansible - 访问角色的默认变量
- python - 在 Python 字典中的字符串中添加重复出现的字母的字符索引
- binary - 补码数的最高位是否指示其符号?
- python - 每次迭代中 i=srqt(i) 时的运行时间/时间复杂度