5

私は現在非同期ソケットを研究しており、次のコードがあります。

#!/usr/bin/env python 

""" 
An echo server that uses select to handle multiple clients at a time. 
Entering any line of input at the terminal will exit the server. 
""" 

import select 
import socket 
import sys 

host = 'localhost' 
port = 900 
backlog = 5 
size = 1024 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.bind((host,port)) 
server.listen(backlog) 
input = [server,sys.stdin] 
running = 1 
while running: 
    inputready,outputready,exceptready = select.select(input,[],[]) 

    for s in inputready: 

        if s == server: 
            # handle the server socket 
            client, address = server.accept() 
            input.append(client) 

        elif s == sys.stdin: 
            # handle standard input 
            junk = sys.stdin.readline() 
            running = 0 

        else: 
            # handle all other sockets 
            data = s.recv(size) 
            if data: 
                s.send(data) 
            else: 
                s.close() 
                input.remove(s) 
server.close()

これは、select() を使用する基本的な種類のエコー サーバーである必要がありますが、実行すると、select エラー 10038 が発生します - ソケットではないものを操作しようとしています。誰かが何が悪いのか教えてもらえますか? ありがとうございました:)

4

3 に答える 3

6

あなたはWindowsで作業していますね。Windows では、select はソケットでのみ機能します。しかし、sys.stdin はソケットではありません。15行目から削除すると、機能するはずです。

Linux などでは、上記のように動作すると思います。

于 2012-08-30T10:35:52.450 に答える
2

documentationに関しては、正しい操作方法は次のとおりselectです。

ready_to_read, ready_to_write, in_error = select.select(potential_readers,
                                                        potential_writers,
                                                        potential_errs,
                                                        timeout)

あなたのコードでは、

input = [server,sys.stdin] 

sys.stdinソケットではありません (代わりにファイル記述子)。

于 2012-08-30T10:27:41.743 に答える