Чтобы установить ограничение по времени и количеству попыток подключения при использовании asyncio, можно скорректировать функцию `connect_whois_server` следующим образом:
```python
async def connect_whois_server(domain=None, server=None, port=80, timeout=None, attempts=1):
try:
for attempt in range(attempts):
try:
reader, writer = await asyncio.open_connection(server, port, timeout=timeout)
query = (domain + "\r\n").encode()
writer.write(query)
await writer.drain()
response = b""
while True:
data = await asyncio.wait_for(reader.read(4096), timeout=timeout)
if not data:
break
response += data
writer.close()
await writer.wait_closed()
return response.decode()
except asyncio.TimeoutError:
print(f"Попытка {attempt+1}: Превышено время ожидания соединения.")
print("Все попытки подключения завершились неудачно.")
return None
except Exception as e:
print(f"Произошла ошибка при выполнении запроса: {e}")
return None
```
Изменения внесены в строку `data = await asyncio.wait_for(reader.read(4096), timeout=timeout)`, где установлено ограничение по времени ожидания при чтении данных из потока. Теперь при каждой попытке чтения данных будет применяться указанный таймаут.
Теперь при вызове функции `connect_whois_server` можно указать параметры `timeout` и `attempts`, чтобы установить ограничения по времени и количеству попыток подключения:
```python
response = await connect_whois_server(domain="example.com", server="whois.verisign-grs.com", timeout=5, attempts=3)
```
В данном примере установлено время ожидания 5 секунд и 3 попытки подключения к серверу WHOIS для домена example.com.