2011-06-21 59 views
1

我正在使用epoll进行网络编程。我想知道服务器没有收到所有发送的数据客户端的情况。例如,如果一个客户端发送了100个字节,并且某个服务器只收到了94个字节。我如何处理这种情况?epoll异常处理

在此先感谢..

+0

这与C++或epoll没有任何关系。 –

+0

通常,这必须在应用程序级别进行处理,如果您收到的数据比预期的少,则需要以某种方式重新请求该数据。如果你的连接是TCP,我很惊讶,如果是UDP,那么任何事情都是可能的。可能是后续的等待操作会返回未完成的数据 - 你试过了吗? – Nim

回答

3

的epoll的信号准备,它并没有提供有关数据量任何保证。 EPOLLIN只给你保证描述符的下一次读操作不会被阻塞,并且至少读1个字节。
由于通常将描述符设置为针对各种(部分特定于操作系统的)原因的非阻塞描述符,通常的习惯用法是读取,直到返回EAGAIN。如果这比预期的数据少(例如,如果你有一个标题为“我的大小是100字节”的消息),那么你将等待下一个EPOLLIN(或EPOLLHUP)并重复(或中止)。

对于TCP,接收比预期更少的数据是绝对正常的情况。重复。使用UDP,除非你提供了一个太小的缓冲区(这会放弃其余的!),这不会发生。永远不能。 UDP一次或全部传送整个数据报。没有部分交付。如果发生IP碎片,UDP会将所有碎片重新组合成一个数据报并发送整个数据报。如果一个片断丢失,UDP将不会提供任何内容。