在讨论这个话题之前,我们需要进行一个情况的设想:
假如我是一个大学生,手头有一台Nivdia显卡的电脑(不论是台式机还是笔记本),同时还有一个平板电脑,现在我希望能够用平板电脑配合键鼠来实现对电脑的访问,从而使我能够在图书馆/宿舍/学校的咖啡厅/家里以及其他地方访问我的电脑,我该如何操作?
众所周知,把大象放进冰箱只需要三步,那么我们在执行这个操作时也需要三步:进入内网、获取IP、进行串流。
我想有关Moonlight或其他软件进行N卡串流的教程网上以及说的足够清楚,此处不加以赘述。但由于我们有可能无法访问校园网IPV6的防火墙以进行一系列设置,因此在大多数情况下我们还是要通过IPV4的形式来进行串流。在国内,你很难找到一个10M带宽且延迟在50ms以内的VPS,因此这种试图通过公网IP服务器作为中转的串流方式往往质量很低。而由于不同学校的校园网状况不同,我们这里重点介绍借助校园VPN来实现内网连接。
虽然各大高校的校园网可以看作是一个大内网,由各大教育网给定其专用的公网IP(例如天津大学的202.113.13.*),同时将内网IP分配给各个登录校园网的设备(172或198开头等),然而即使你的平板和你的电脑分配在了一个频段下,往往也无法在Moonlight串流时正确的访问,原因见此。这种情况就很糟糕,不过校园网VPN则可以有效的缓解这个情况。然而内网IP可能随时都在进行变化(如果你的工作室/专业课教室自建了路由器则可以通过设置使其不变),这使得我们不可能每次都查询这个IP地址,一旦IP发生变化,我们的串流软件就有可能搜索不到已经连接的设备。
针对这个问题,我在我的电脑上部署了一段python程序,当本地内网IP一旦发生变化,就可以通过邮件提醒的方式来通知我。我也可以根据变动的IP地址帮我重新进行Moonlight的连接。此方法也适用于其他路由器等形式连接,一旦IP发生变化即可得到通知。
import time
import socket
import smtplib
from email.mime.text import MIMEText
def get_ipv4_address():
# 创建一个 socket 对象
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
# 连接到 Google 的 DNS 服务器获取本地 IPv4 地址
sock.connect(('8.8.8.8', 80))
ip = sock.getsockname()[0]
return ip
except socket.error:
return None
finally:
sock.close()
def send_email(ip):
# 邮箱配置信息
smtp_server = 'smtp.163.com' # 邮箱SMTP服务器地址,可自行查询
smtp_port = 25 # SMTP服务器端口号,可自行查询
sender_email = 'example1@163.com' # 发件人邮箱
sender_password = 'EXAMPLEPASSWD' # SMTP密钥
receiver_email = 'example2@163.com' # 收件人邮箱
# 构造邮件内容
message = MIMEText(f'Your current IPv4 address is {ip}')
message['Subject'] = 'IP Address Notification'
message['From'] = sender_email
message['To'] = receiver_email
# 发送邮件
try:
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls()
server.login(sender_email, sender_password)
server.sendmail(sender_email, receiver_email, message.as_string())
print('Email sent successfully')
except smtplib.SMTPException as e:
print('Failed to send email:', str(e))
# 初始化上次获取到的 IP 地址为空
previous_ip = None
# 获取初始 IPv4 地址并发送邮件
initial_ip = get_ipv4_address()
if initial_ip:
send_email(initial_ip)
while True:
# 获取当前 IPv4 地址
current_ip = get_ipv4_address()
if current_ip:
# 比较当前 IP 与上次 IP,只有在发生变化时才发送邮件
if previous_ip is not None and current_ip != previous_ip:
send_email(current_ip)
# 更新上次 IP 为当前 IP
previous_ip = current_ip
else:
print('Failed to get IP address')
# 间隔半小时再次获取 IP
time.sleep(1800) # 1800 秒 = 30 分钟
将这段Python程序部署在本地,通过各种方式使其开机启动,即可让电脑每半个小时获取一次IP。一旦当你无法检索到自己的电脑时(前提是你知道是由于IP变动导致的,而不是校园网VPN连接失败/断电等原因导致的),在半个小时以内你就会收到IP变动的邮件,将新的IP输入回Moonlight或其他串流软件,你就可以继续使用了。