废话不多说直接上代码:
import socket
import time
def socket_bind(server_socket, host, port=514, max_retries=5):
retries = 0
while retries < max_retries:
try:
server_socket.bind((host, port))
print(f"syslog服务器已启动,监听端口{port}")
break # 如果绑定成功,跳出循环
except OSError:
port = input(f"当前端口 {port} 可能被占用,请重新输入一个端口(500-65500):")
while True:
if not port.isdigit():
port = input("输入无效,不是一个有效的整数,请重新输入:")
continue
port = int(port)
if not 500 <= port <= 65500:
port = input("输入无效,数字不在范围内,请重新输入:")
continue
break
retries += 1
else:
print("绑定端口失败,即将退出...")
time.sleep(3)
exit()
def udp_server(host, port):
# 创建UDP套接字
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as server_socket:
# 将套接字绑定到指定的地址和端口
socket_bind(server_socket, host, port)
with open("syslog.log", mode="w", encoding="utf-8") as s:
while True:
# 接收数据
data, client_address = server_socket.recvfrom(10000)
print(f"接收到来自 {client_address} 的日志: {data.decode('utf-8')}", flush=True)
s.write(f"接收到来自 {client_address} 的日志: {data.decode('utf-8')}")
s.flush()
if __name__ == "__main__":
# 设置服务器的主机和端口
server_host = "0.0.0.0" # 监听所有网络接口
server_port = 514
# 启动UDP服务器
udp_server(server_host, server_port)