0

私は単純なマルチプレイヤー オンライン テキスト ゲームに取り組んでおり、I/O を多重化する一般的な方法select()を読みました。poll()

この例は、GNU C docs で見つけましたselect。私はそれを実行し、次のような 3 つの Python テスト クライアントを作成しました。

import socket
import time

port = 5555
test = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
test.connect(('localhost', port))

while 1:
    test.send('aaaa')
    time.sleep(0.5)

次に、クライアントを (サーバーを実行している同じコンピューターから) 異なる文字列 ( aaaa55および..) で実行しました。

サーバーの出力は

Server: got message: `aaaa'
Server: got message: `55aa'
Server: got message: `aaaa'
Server: got message: `55aa'
Server: got message: `..aa'

弦が混じっていました。

これはばかげたコンパイル エラーですか、テスト クライアントのエラーですか、それとも同じコンピュータからクライアントとサーバーを実行しているという事実ですか? selectそれとも、このプログラムは、この目的に使用すべきではないと言っていますか? これをマルチプレイヤー ゲーム サーバー (おそらく 1 秒間に大量のメッセージを受け取る) に使用することを考えると、メッセージを混同させることはできないと思います。

4

1 に答える 1

1

クライアントとサーバーは完全に非同期です。どれがどの順序で CPU の時間を取得するかわかりません。ネットワークは、配信の順序についても保証しません (ただし、TCP は、アプリケーションが送信された順序で単一のクライアントからのデータを確認することを保証します)。

Select/Poll は、読み取るデータがあるソケットのリストを返します。select/poll を再度呼び出す前に、それらをすべて読んでください。そうしないと、番号の小さいポートでの接続が優先されます。

読み取りは生データであり、いかなる方法でも終了しないため、送信者がソケットへの書き込みに NUL ターミネータを含めない限り、文字列として直接ダンプできないことに注意してください。

于 2012-10-12T22:32:57.057 に答える