0

同じローカル ネットワーク上の他の PC が接続できるように、ローカル サーバーをセットアップしようとしています。そうしようとすると、クライアント側で次のエラーが発生します: [Errno 10061] ターゲット マシンがアクティブに拒否したため、接続できませんでした。

私は何時間も探し回っていますが、まだこの問題を解決できませんでした。ファイアウォールもオフにしようとしましたが、何もしませんでした。

これらは私のサーバーとクライアントのコードです:

サーバーコード:

import socket
import threading
import SocketServer
import datetime

ver_codes = []



class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        print threading.current_thread().isDaemon()
        data = self.request.recv(1024)
        command = data.split()[0]
        if(command=="login"):
            if(logged_in(data.split()[1])==False):
                self.request.sendall(login(data.split()[1], data.split()[2]))
            else:
                self.request.sendall("already in")


class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    pass

def client(ip, port, message):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((ip, port))
    try:
        sock.sendall(message)
        response = sock.recv(1024)
        print "Received: {}".format(response)
    finally:
        sock.close()

def logged_in(id_num):
    for i in ver_codes:
        if(i[0]==id_num):
            return True
    return False

def login(username, password):
    login_file = open("Login.txt", "r")
    match = login_file.readline()
    while(match!="*"):
        if(match.split()[0]==username):
            if(match.split()[1]==password):
                ver_codes.append([match.split()[0], encryption_code(match.split()[2])])
                login_file.close()
                return "{} {}".format(match.split()[2], encryption_code(match.split()[2]))
                print "And Here"
        match = login_file.readline()
    return "Denied"
    login_file.close()

def encryption_code(to_encrypt):
    now = datetime.datetime.now()
    return int(str(now.microsecond)) * int(to_encrypt)


if __name__ == "__main__":
HOST, PORT = "localhost", 7274

server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
ip, port = server.server_address
print server.server_address

server_thread = threading.Thread(target=server.serve_forever)
server_thread.daemon = False
server_thread.start()
print "Server loop running in thread:", server_thread.name

クライアントコード:

import socket
import sys

HOST, PORT = "localhost", 7274
data = " ".join(sys.argv[1:])

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
sock.connect((HOST, PORT))
sock.sendall("login mahdiNolan m1373")

received = sock.recv(1024)
finally:
sock.close()

あなたが私に与えることができるどんな助けにも本当に感謝します! 事前にたくさんありがとう!

4

1 に答える 1

1

問題は、リッスンしているためです。localhostこれは、ローカル マシンからの接続のみを受け入れます。

"localhost"空の文字列を渡すだけでなく、どこからでも接続を受け入れたい場合""。これはINADDR_ANY、C ソケット API に指定することと同じです。詳細については、ip man ページを参照してください。または、このページにも役立つ説明があるようです。つまり、これは「任意のローカル インターフェイスで接続を受け入れる」ことを意味します。

空の文字列の代わりに、ローカル インターフェイスの IP アドレスを指定して、そのインターフェイスでの接続のみを受け入れるようにすることができます。マシンに複数のネットワーク カードがあり (たとえば、ゲートウェイとして機能している場合)、ローカル インターフェイスのみを使用しない限り、これを行う必要はほとんどありません。いずれかのネットワークでリクエストを処理したい。

また、クライアント側では、マシンの実際のアドレスを使用する必要が"localhost"あります。サーバー マシンの IP アドレスまたはホスト名に置き換えてください。たとえば、 のようなもの"192.168.0.99"です。Windows でサーバーの IP アドレスを見つけたい場合は、DOS ウィンドウを開いてipconfigコマンドを実行し、次の行を探しますIPv4 Address(IPv4 ネットワークを使用していると仮定すると、可能性が非常に高くなります)。

また、Windows ファイアウォールはサーバーが接続を受け入れるのをブロックしますが、これを無効にする必要はありません。サーバーを実行するとすぐに、接続を受け入れるように指示できるポップアップ ウィンドウが表示されます (これは Windows 7 の場合であり、他のバージョンでは異なる場合があります)。いずれにせよ、ソフトウェア ファイアウォールをオフにすると、すべてが機能するようになりますが、それがセキュリティ リスクであるかどうかは、この質問の範囲外の問題です。

于 2013-01-29T14:00:16.647 に答える