2016-11-01 18 views
0

私はソケットを使用する方法を学び、IP、ポート、ファイルを送信するクラスをまとめています。これはlocalhost上で動作しますが、ネットワーク上の別のホストのipに渡すときは動作しません。ファイルをソケット経由で送信する - bind()

これはトレースバックです:

multiprocessing.pool.RemoteTraceback: 
""" 
Traceback (most recent call last): 
    File "/path/to/anaconda3/envs/env/lib/python3.5/multiprocessing/pool.py", line 119, in worker 
    result = (True, func(*args, **kwds)) 
    File "script.py", line 91, in servr 
    servr.bind((self.ip, self.port)) 
OSError: [Errno 99] Cannot assign requested address 
""" 

The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
    File "script.py", line 163, in <module> 
    main() 
    File "script.py", line 157, in main 
    rmt.client() 
    File "script.py", line 85, in client 
    machines.update({self.ip: {self.port: path.get()}}) 
    File "/path/to/anaconda3/envs/env/lib/python3.5/multiprocessing/pool.py", line 608, in get 
    raise self._value 
OSError: [Errno 99] Cannot assign requested address 

これはコードです:

class Remote: 

    def __init__(self, ip, port, filename): 
     self.ip = socket.gethostbyname(ip) 
     self.port = int(port) 
     self.filename = filename 

    def client(self): 
     pool = Pool(processes=1) 
     path = pool.apply_async(self.servr) 
     time.sleep(1) 
     client = socket.socket() 
     client.connect((self.ip, self.port)) 
     with open(self.filename, 'rb') as file: 
      data = file.read() 
      client.sendall(data) 
     machines = {} 
     try: 
      with open("machines.pickle", 'rb') as file: 
       machines = pickle.load(file) 
     except (EOFError, FileNotFoundError): 
      pass 
     finally: 
      with open("machines.pickle", 'wb') as file: 
       machines.update({self.ip: {self.port: path.get()}}) 
       pickle.dump(machines, file) 

    def servr(self): 
     servr = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     servr.bind((self.ip, self.port)) 
     servr.listen(5) 
     client, addr = servr.accept() 
     file = open("." + self.filename, 'wb') if platform.system() == 'Linux' else os.popen(
     "attrib +h " + self.filename, 'wb') 
     data = client.recv(6000) 
     file.write(data) 
     file.close() 
     file = "." + self.filename if platform.system() == 'Linux' else self.filename 
     os.chmod(file, os.stat(file).st_mode | 0o111) 
     client.close() 
     servr.close() 
     return os.path.abspath(file) 

私は("", 0)への結合を試みたが、その後のコードはaccept()への呼び出しを超えて実行されません。おそらくポートはすでに使用されていますか?私もsocket.settimeout()を試しましたが、それはaccept()から抜け出していますが、プログラムは最初のメソッドのdict更新まで実行されますが、送信されたファイルはありませんでした。

答えて

1

サーバーの場合、.bind(('',port))が標準であり、どのインターフェイスでもクライアント接続を受け入れることを意味します。ポート0を使用するのは一般的ではありません... 1024を超える数値を使用するのが一般的です。クライアントがサーバーに接続するまで、コードはacceptを超えて実行されないため、acceptでの停止も正常です。

関連する問題