0

コードを研究する単純なクライアントサーバーソケット、サーバー側は次のとおりです。

import socket,select,time

s = socket.socket()

host = socket.gethostname()
port = 1234
s.bind((host,port))
s.listen(50)
s.setblocking(0)              # (1)

fdmap = {s.fileno():s}

p = select.epoll()
p.register(s)
while True:
    events = p.poll()
    for fd,event in events:
       if fd is s.fileno():
           c,addr = s.accept()
           c.setblocking(0)                    #(2)
           print('Got connection from: ',addr)
           p.register(c)
           fdmap[c.fileno()] = c 
       elif event & select.EPOLLIN:
           data = fdmap[fd].recv(1024)
           if not data:
               print('disconnected')
               p.unregister(fd)
               del fdmap[fd]
           else:
               print(data)

クライアントエンドは

import socket,time

s = socket.socket()

host = socket.gethostname()
port = 1234

s.connect((host,port))
print(s.send(b'hello server'))


私の質問: 0) (1),(2)の目的は何ですか? 私はそれらを延期しようとしましたが、それでも機能します

2.実行中、クライアントエンドは遅くなる可能性があり、約1秒後に12(サーバーに送信するバイト)を出力し、time.time()ステートメントを1つずつ使用してプロファイリングし、s .connect((host,port)) は通常約 1 秒かかりますが、どこが間違っていますか? (これは poll/epoll で発生し、select を使用すると、クライアント側が非常に高速になります)

4

1 に答える 1

1

ドキュメントを確認すると、epollpoll関数がtimeoutパラメーターを受け取ることがわかります。これは、デフォルトで-1無期限に待機することを意味します。タイムアウトをゼロに設定すると、すぐに戻ります。

遅延については、connectおそらくconnectIP アドレスを見つけるためにホスト名の DNS ルックアップを行う必要があるためです。

于 2012-10-05T05:36:35.463 に答える