我有一个简单的tcp/ip服务器用C++在linux上编写。我使用异步套接字和epoll。当我收到EPOLLIN事件时,是否有可能找出有多少字节可供阅读?我怎样才能获得可用于在Linux上的异步套接字上读取的字节数?
回答
从man 7 tcp
:
int value;
error = ioctl(sock, FIONREAD, &value);
或替代地SIOCINQ
,这是FIONREAD
的同义词。
无论如何,我建议只是在循环中以非阻塞模式使用recv
,直到它返回EWOULDBLOCK
。
UPDATE:
从您的评论下面我想,这是不是你的问题,相应的解决方案。
想象一下,你的标题是8字节,你只收到4;那么你的poll/select
将返回EPOLLIN
,你会检查FIONREAD
,看到头还没有完成和更多的字节wayt。但是这些字节永远不会到达,因此每次调用poll/select
时都会收到EPOLLIN
,并且您有一个无操作的忙循环。也就是说,poll/select
是级触发的。不是边缘触发功能也可以解决您的问题。
最后,你做得好一点,每个连接添加一个缓冲区,然后排队字节,直到有足够的空间。它并不像看起来那么困难,而且效果更好。例如,类似的东西:
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;
}
谢谢你的回答!是的,我可以使用recv或像这样读取,但我有一个二进制协议,它将数据包的大小存储在它的头中,所以我认为代码可以变得更简单,如果我要检查头是否已经可以读取或不。 –
@PavelDavydov:事实上,在这里有一个缓冲区和积累可能(只是)有点复杂。但我认为你可能会削减太多的角落......请看我的更新。 – rodrigo
是的,无休止地获取EPOLLIN可能是一个问题,谢谢。我的服务器的行为方式与您推荐的类似,我只是认为它可以做得更简单,更清洁。 –
- 1. 我怎样才能*在bash中获得磁盘上的可用字节数?
- 2. 异步套接字上的Linux
- 3. 如何获得在异步读取中读取的字节数?
- 4. 我怎样才能得到的数字
- 5. 我怎样才能从字符串中获得可变数字?
- 6. 异步套接字读取
- 7. 异步套接字读取
- 8. 我怎样才能在铬上的div上获得keydown事件?
- 9. 我怎样才能读取MP3到字节阵列
- 10. 我怎样才能读取不同数量的数字
- 11. 我怎样才能读取嵌套的JSON数组使用AESON
- 12. 我怎样才能得到这个字符串可读?
- 13. 获取套接字中可读取的字节数
- 14. 我怎样才能获得文字,在我的XML属性值
- 15. 我怎样才能得到一个MySQL表上的字段?
- 16. 可以在连接的套接字上读取()函数返回零字节吗?
- 17. 是否有可能在异步套接字上等待连接
- 18. 我怎样才能在twitter上获得过去的信息?
- 19. 我怎样才能限制在我的CC细节上的字符编号android
- 20. 我怎样才能发布音频的网络套接字
- 21. 我怎样才能零等于一个类的填充字节?
- 22. 我怎样才能获得ASCII字符从字符串二郎
- 23. 我怎样才能从字符串中获得几个字符?
- 24. 我怎样才能使一个套接字连接非本地?
- 25. 我怎样才能获得的java.awt.geom
- 26. 我怎样才能读取在JavaScript
- 27. 我怎样才能获得actionName在ActionFilter
- 28. 我怎样才能在Android 4.0的上
- 29. 我怎样才能得到下面的数组中的数字
- 30. 异步套接字读取问题
为什么? recv()会告诉你,并给你数据。 – EJP
那么,有时知道缓冲区的大小可能相当方便,应该将其分配给阅读。例如,在kqueue中,字节数在数据字段中返回。 –
恕我直言,你不应该分配一个缓冲区来阅读。这只会产生垃圾,堆碎片等。您应该使用本地分配的字节数组。 – EJP