なんか、すっかり放置していました
私は GUI でチャットなどを作るはずだったのです
しかし全く着手せぬまま現在に至っています、ごめんなさい
そこで、少しだけ epoll 触っとこうと思うことにして調べました
How To Use Linux epoll with Python
何とも丁寧な説明がありました
とりあえず
- select.epoll.register で file descriptor と何を監視するかを登録
- select.epoll.poll で active なやつをとってくる
というわけで、少し試してみることに
import socket
import select
from OpenSSL.SSL import Connection, Context, SSLv23_METHOD
fqdn = 'www.google.com'
s = socket.socket()
s.settimeout(0)
epoll = select.epoll()
epoll.register(s.fileno(), 2**11-1)
print epoll.poll(1)
s.connect_ex((fqdn, 443))
print "connect"
print epoll.poll(1)
ctx = Context(SSLv23_METHOD)
print "make Context"
print epoll.poll(1)
c = Connection(ctx, s)
print "make Connection"
print epoll.poll(1)
c.set_connect_state()
print "set connect state"
print epoll.poll(1)
c.do_handshake()
print "do handshake"
print epoll.poll(1)
x509 = c.get_peer_certificate()
print x509.get_subject()
で、結果がこちら
$ python test1.pynon-blocking のまま handshake しようとして怒られました
[(3, 276)]
connect
[(3, 260)]
make Context
[(3, 260)]
make Connection
[(3, 260)]
set connect state
[(3, 260)]
Traceback (most recent call last):
File "test1.py", line 26, in <module>
c.do_handshake()
OpenSSL.SSL.WantReadError
select.EPOLLOUT = 4, select.EPOLLHUP = 16, select.EPOLLWRNORM = 256
みたいなんですけど、まぁ、OUT だけ見りゃいいのかな、この場合
教訓:「OpenSSL の handshake を呼ぶんなら blocking にしよう」
え、そこなの?