检查网络连接状态
使用Python的socket
模块可以快速检查网络是否连通。以下代码尝试连接Google的DNS服务器(8.8.8.8)来判断网络状态:
python
import socket
def check_internet(host="8.8.8.8", port=53, timeout=3):
try:
socket.setdefaulttimeout(timeout)
socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port))
return True
except Exception as ex:
print(f"No internet connection: {ex}")
return False
if check_internet():
print("Network is active")
else:
print("No network connection")
获取当前网络配置
在Windows系统上,可以通过ipconfig
命令获取网络配置。使用Python的subprocess
模块调用系统命令:
python
import subprocess
def get_network_config():
try:
result = subprocess.run(["ipconfig", "/all"],
capture_output=True,
text=True,
check=True)
print(result.stdout)
except subprocess.CalledProcessError as e:
print(f"Error getting network config: {e.stderr}")
get_network_config()
重置网络适配器
在Windows系统中重置网络适配器的完整方案:
python
import os
def reset_network_adapters():
commands = [
"netsh winsock reset",
"netsh int ip reset",
"ipconfig /release",
"ipconfig /renew",
"ipconfig /flushdns"
]
for cmd in commands:
try:
print(f"Executing: {cmd}")
os.system(cmd)
except Exception as e:
print(f"Error executing {cmd}: {e}")
reset_network_adapters()
检查特定端口连通性
测试特定主机和端口的网络连通性:
python
import socket
from concurrent.futures import ThreadPoolExecutor
def test_port(host, port):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(2)
try:
s.connect((host, port))
return f"Port {port} is open"
except:
return f"Port {port} is closed"
def scan_ports(host, ports):
with ThreadPoolExecutor(max_workers=10) as executor:
results = executor.map(test_port, [host]*len(ports), ports)
for result in results:
print(result)
scan_ports("example.com", [80, 443, 22, 3389])
网络速度测试
使用speedtest-cli
库进行网络速度测试:
python
import speedtest
def run_speed_test():
st = speedtest.Speedtest()
st.get_best_server()
download = st.download() / 1_000_000 # Convert to Mbps
upload = st.upload() / 1_000_000 # Convert to Mbps
print(f"Download Speed: {download:.2f} Mbps")
print(f"Upload Speed: {upload:.2f} Mbps")
print(f"Ping: {st.results.ping} ms")
run_speed_test()
网络流量监控
使用psutil
库监控网络流量:
python
import psutil
import time
def monitor_network(duration=60, interval=1):
start = time.time()
initial = psutil.net_io_counters()
while time.time() - start < duration:
time.sleep(interval)
current = psutil.net_io_counters()
sent = (current.bytes_sent - initial.bytes_sent) / 1_000_000 # MB
recv = (current.bytes_recv - initial.bytes_recv) / 1_000_000 # MB
print(f"Upload: {sent:.2f} MB | Download: {recv:.2f} MB")
initial = current
monitor_network(duration=10)
网络故障排除日志
创建完整的网络诊断日志:
python
import datetime
import platform
import subprocess
def create_network_log():
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"network_diagnostic_{timestamp}.log"
with open(filename, "w") as f:
f.write(f"=== System Information ===\n")
f.write(f"OS: {platform.system()} {platform.release()}\n")
f.write(f"Python: {platform.python_version()}\n\n")
f.write("=== Network Configuration ===\n")
try:
ipconfig = subprocess.run(["ipconfig", "/all"],
capture_output=True,
text=True)
f.write(ipconfig.stdout + "\n")
except Exception as e:
f.write(f"Error getting ipconfig: {str(e)}\n")
f.write("\n=== Connection Tests ===\n")
test_commands = [
("Ping Google", "ping 8.8.8.8 -n 4"),
("Traceroute Google", "tracert 8.8.8.8"),
("NSLookup Google", "nslookup google.com")
]
for name, cmd in test_commands:
f.write(f"\n{name}:\n")
try:
result = subprocess.run(cmd.split(),
capture_output=True,
text=True)
f.write(result.stdout)
if result.stderr:
f.write(f"Error: {result.stderr}\n")
except Exception as e:
f.write(f"Error executing {cmd}: {str(e)}\n")
print(f"Diagnostic log created: {filename}")
create_network_log()