我在Linux上用C++编写了一个简单的TCP/IP服务器。我使用异步套接字和epoll。当我获得EPOLLIN事件时,是否有可能找出有多少字节可供阅读?
我在Linux上用C++编写了一个简单的TCP/IP服务器。我使用异步套接字和epoll。当我获得EPOLLIN事件时,是否有可能找出有多少字节可供阅读?
来自 man 7 tcp
:
int value;
error = ioctl(sock, FIONREAD, &value);
struct ConnectionData
{
int sck;
std::vector<uint8_t> buffer;
size_t offset, pending;
};
void OnPollIn(ConnectionData *d)
{
int res = recv(d->sck, d->buffer.data() + offset, d->pending);
if (res < 0)
handle_error();
d->offset += res;
d->pending -= res;
if (d->pending == 0)
DoSomethingUseful(d);
}
每当您想获取一定数量的字节:
void PrepareToRecv(ConnectionData *d, size_t size)
{
d->buffer.resize(size);
d->offset = 0;
d->pending = size;
}