2

少量のデータを待ってポートをリッスンし、何をすべきかを指示するプログラムがあります。そのプログラムの5つのインスタンスを実行します。1つは5000から5004までの各ポートで実行します。

ソケット「s」を作成し、データをポート5000に書き込んでから閉じる、Pythonで記述された2番目のプログラムがあります。次に、ポート番号をインクリメントし、5001に接続された新しいソケットを作成します。5004に達するまでこれを行います。

最初の3つのソケット接続は問題なく機能します。ポート5000から5002のプログラムは、データを問題なく受信します。ただし、4番目のソケット接続では、「接続が拒否されました」というエラーメッセージが表示されます。一方、4番目のリスニングプログラムは、ポート5003で待機していることを報告します。Telnetを使用して接続できるため、正しくリッスンしていることがわかります。

ポート番号を変更してみましたが、4回目の接続で失敗するたびに失敗しました。

チェックする必要のあるシステムに制限はありますか?送信側では常に1つのソケットしか開いていません。また、5つのうち3つを取得できるという事実により、考えられる基本的なトラブルシューティング手順の多くが不要になります。

何かご意見は?ありがとう!

- - 編集 - -

私はPythonバージョン2.6のCentOSLinuxを使用しています。次にいくつかのサンプルコードを示します。

try:
        portno = 5000
        for index, data in enumerate(data_list):
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                s.connect(('myhostname', portno))
                s.sendall(data)
                s.close()
                portno = portno + 1
except socket.error, (value,message):
        print 'Error: Send could not be performed.\nPort: ' + str(portno) + '\nMessage: ' + message
        sys.exit(2)
4

3 に答える 3

1

ソケットについてはあまり知らないので、これは本当に悪いスタイルかもしれません...自己責任で使用してください。このコード:

#!/usr/bin/python
import threading, time
from socket import *
portrange = range(10000,10005)

class Sock(threading.Thread):
    def __init__(self, port):
        self.port = port
        threading.Thread.__init__ ( self )

    def start(self):
        self.s = socket(AF_INET, SOCK_STREAM)
        self.s.bind(("localhost", self.port))
        self.s.listen(1)
        print "listening on port %i"%self.port
        threading.Thread.start(self)
    def run(self):
        # wait for client to connect
        connection, address = self.s.accept()
        data = True
        while data:
            data = connection.recv(1024)
            if data:
                connection.send('echo %s'%(data))
        connection.close()

socketHandles = [Sock(port) for port in portrange]

for sock in socketHandles:
    sock.start()

# time.sleep(0.5)

for port in portrange:
    print 'sending "ping" to port %i'%port
    s = socket(AF_INET, SOCK_STREAM) 
    s.connect(("localhost", port))
    s.send('ping')
    data = s.recv(1024)
    print 'reply was: %s'%data
    s.close()

出力する必要があります:

listening on port 10000
listening on port 10001
listening on port 10002
listening on port 10003
listening on port 10004
sending "ping" to port 10000
reply was: echo ping
sending "ping" to port 10001
reply was: echo ping
sending "ping" to port 10002
reply was: echo ping
sending "ping" to port 10003
reply was: echo ping
sending "ping" to port 10004
reply was: echo ping

おそらくこれは、ファイアウォールが問題を引き起こしているかどうかを確認するのに役立ちます。これをクライアントとサーバーに分割してみることもできると思います。

于 2009-07-18T14:38:43.620 に答える
1

これは、ファイアウォールが作動するポートスキャン対策によく似ています。

于 2009-07-18T03:40:15.737 に答える
0

アイドル内から2番目のPythonプログラムを実行していますか?もしそうなら-アイドルの外で試してみて、結果が違うかどうかを確認してください。

于 2009-07-18T14:53:34.487 に答える