Так у вас UDP сокет, поэтому со стороны клиента нужно сделать тоже самое, что и со стороны сервера bind()
, потом, как-то серверу передать порт, на котором клиент будет слушать ответ от сервера. Запустить поток, который будет обслуживать входящие сообщения от сервера. (Итого, два потока, один для посылки серверу, второй для ответов от сервера).
На стороне сервера использовать не recv()
а data, addr = sock.recvfrom(128)
, получая сразу IP-адрес клиента. Вот эти адреса прихраниваете в массивчик, они и будут вашими клиентами.
Можно изобрести свой протокол хендшейка, где первое сообщение будет порт (и чего нибудь служебное, типа public-ключа), на котором слушает клиент (конечно порт клиента можно забить в код навечно).