2016-06-29 7 views
0

REUSEADDRオプションを使用しても、同じポートセットを再利用することはできません。それは私に98、 "アドレスは既に使用中"のエラーを与えます。Pythonで同じポートを2回使用する方法

2番目のグループの前に最初のソケットグループを強制終了する方法はありますか?

以下のコードでは、まったく同じことを2回行っています。

servers = [] 
port_list = [i for i in range(40007, 40107)] 
for port in port_list: 
    ds = ('', port) 
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    server.bind(ds) 
    server.listen(1) 
    servers.append(server) 

found,_,_ = select.select(servers, [], []) 
found = found[0] 
conn, addr = found.accept() 
print 'Connected by', addr 
data = conn.recv(1024) 
print "received", data 
conn.sendall("message!!") 

conn.close() 



#time.sleep(10) # even this doesn't work 


port_list = [i for i in range(40007, 40107)] 
for port in port_list: 
    ds = ('', port) 
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    server.bind(ds) 
    server.listen(1) 
    servers.append(server) 

found,_,_ = select.select(servers, [], []) 
found = found[0] 
conn, addr = found.accept() 
print 'Connected by', addr 

data = conn.recv(1024) 
print "received", data 
conn.sendall("message!!") 

答えて

3

完了後、サーバーソケットを閉じる必要があります。 SO_REUSEADDRは、オープンソケットのアドレスを使用することはできません。最近閉じていてもまだTIME_WAIT状態のままです。

+0

100個のサーバーソケットを完全に削除するにはどうすればよいですか? (それがあなたが意味するものなら)。私は受け入れられた接続のためにconn.close()を1回行っています。 – Jobs

+0

私はserver:server.close()のサーバーで試しましたが動作しません。 – Jobs

+0

サーバソケットをループし、それらも '.close()'します。 –

1

SO_REUSEPORT vs SO_REUSEADDRと同じサーバーリストに追加しています。それはあなたのために働くのですか?

#!/usr/bin/env python 
import os 
import sys 
import socket 
import select 

while True: 
    servers = [] 
    port_list = [i for i in range(40007, 40107)] 
    for port in port_list: 
     ds = ('', port) 
     server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) 
     server.bind(ds) 
     server.listen(1) 
     servers.append(server) 

    f,_,_ = select.select(servers, [], []) 
    for found in f: 
     conn, addr = found.accept() 
     print 'Connected by', addr 
     data = conn.recv(1024) 
     print "received", data 
     conn.sendall("message!!\n") 
     conn.close() 


    #time.sleep(10) # even this doesn't work 

    servers = [] 
    port_list = [i for i in range(40007, 40107)] 
    for port in port_list: 
     ds = ('', port) 
     server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) 
     server.bind(ds) 
     server.listen(1) 
     servers.append(server) 

    f,_,_ = select.select(servers, [], []) 
    for found in f: 
     conn, addr = found.accept() 
     print 'Connected by -- BB', addr 
     data = conn.recv(1024) 
     print "received --- BB\n", data 
     conn.sendall("message!!----BB\n") 
     conn.close()     
+0

'SO_REUSEPORT'は古いサーバソケットを生き残りさせ、接続はそれらのどれかに"行く "かもしれません。おそらく望ましくない効果。 –

関連する問題