Если клиент закрывает соединение, вы хотите, чтобы он закрыл сокет.
Похоже, что здесь есть некоторая несогласованность, которую я постараюсь уточнить. Когда вы создаете сокет, привязываетесь и слушаете, вы открыли дверь, чтобы другие могли приходить и связываться с вами.
Как только клиент подключается к вам, и вы используете вызов accept()
, чтобы принять соединение и получить новый сокет (conn
), который возвращается вам для взаимодействия с клиентом. Ваш оригинальный сокет прослушивания все еще там и активен, и вы все еще можете использовать его для приема новых подключений.
Глядя на свой код, вы, вероятно, хотите сделать что-то вроде этого:
while True:
print("Now listening...\n")
conn, addr = s.accept()
print 'New connection from %s:%d' % (addr[0], addr[1])
data = conn.recv(socksize)
if not data:
break
elif data == 'killsrv':
conn.close()
sys.exit()
else:
print(data)
Обратите внимание, что это только отправная точка, и, как другие предположили, вы, вероятно, захотите использовать select()
наряду с разветвлением процессов или порождением потоков для обслуживания каждого клиента.