使用kqueue确定套接字另一侧的挂断或套接字的异常状态

时间:2010-08-03 00:26:53

标签: networking bsd kqueue

我已阅读man 2 kqueue但未了解如何在未向EVFILT_READEVFILT_WRITE注册套接字挂断或套接字异常情况时收到通知。除此之外,还不完全清楚kqueue如何完全表示套接字的异常状态。

提前感谢您的回答。

1 个答案:

答案 0 :(得分:1)

可以在忽略所有READ事件的同时获取EOL事件的技巧是为NOTE_LOWAT提供一个非常高的值,从而抑制所有READ事件。

以下是在Python REPL中执行此操作的示例:

Python 2.6.5 (r265:79063, Jul 17 2010, 22:57:01) 
[GCC 4.2.1 20070719  [FreeBSD]] on freebsd8
Type "help", "copyright", "credits" or "license" for more information.
>>> import select
>>> import socket
>>> import sys
>>> a, b = socket.socketpair()
>>> kq = select.kqueue()
>>> kq.control([select.kevent(a, select.KQ_FILTER_READ, select.KQ_EV_ADD, select.KQ_NOTE_LOWAT, sys.maxint)], 0)
[]
>>> b.send('abc')
3
>>> kq.control(None, 10) # Interrupt after some time.
^CTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyboardInterrupt
>>> b.close()
>>> kq.control(None, 10) # Immediate return.
[<select.kevent ident=3 filter=-1 flags=0x8000 fflags=0x0 data=0x3 udata=0x0>]
>>> 

此外,FreeBSD上没有异常状态,引用man 2 select

  

唯一的例外情况   可检测的是带外数据   收到了插座。