![将 udp 套接字连接转发到一系列 IP 地址](https://linux22.com/image/65157/%E5%B0%86%20udp%20%E5%A5%97%E6%8E%A5%E5%AD%97%E8%BF%9E%E6%8E%A5%E8%BD%AC%E5%8F%91%E5%88%B0%E4%B8%80%E7%B3%BB%E5%88%97%20IP%20%E5%9C%B0%E5%9D%80.png)
我有一个程序,它是 udp 套接字客户端。我可以确定该程序应发送到的 IP 地址。不幸的是,我将计算机配置为接入点,并且不知道其他站点上的 UDP 服务器的地址(我的意思是我知道,但接入点不知道)。我的想法是捕获消息并将其发送到网络接口 (wlan0) 范围内的所有可能的 IP。为此我写了一个小的 python 代理,它也可以说明问题。看来对方的服务器也收到了消息。但似乎没有回复。
有没有办法捕获并转发客户端和服务器程序之间的 udp 套接字通信?也许已经有一个可用的程序/工具?我确实没有太多的管理经验。
# Make this Python 2.7 script compatible to Python 3 standard
from __future__ import print_function
# For remote control
import socket
# For sensor readout
import logging
import threading
# For system specific functions
import sys
import os
import time
import datetime
import fcntl
import struct
# Create a sensor log with date and time
layout = '%(asctime)s - %(levelname)s - %(message)s'
# find suitable place for the log file
logging_dir = "/var/log/"
logging_file = "ardu_proxy.log"
if not os.path.isdir(logging_dir):
logging_dir = "/"
# configure logging
logging.basicConfig(filename=logging_dir+logging_file, level=logging.INFO, format=layout)
# Socket for WiFi data transport
udp_port = 14550
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_server.bind(('0.0.0.0', udp_port))
def get_if_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
def get_ip4_adr(adr):
array = adr.split('.')
str = ""
for i in xrange(0, 3):
str += array[i] + "."
return str
def echo_thr(): # trnm_thr() sends commands to Arduino
udp_msg = None
if_name = "wlan0"
# get local interface address
apif_wlan0 = get_if_address(if_name)
apif_wlan0 = get_ip4_adr(apif_wlan0)
while True:
# receive a message running on local host
udp_msg, udp_client = udp_server.recvfrom(512) # Wait for UDP packet from ground station
logging.debug(udp_msg)
print(udp_msg)
# forward the msg and broadcast it in the complete network :D
for ofs in xrange(1, 254):
adr = apif_wlan0 + str(ofs)
print(adr, ": ", udp_msg)
udp_server.sendto(udp_msg, (adr, udp_port) )
echo_thr()
答案1
也许你可以看看索卡特。例子:
socat -u tcp-listen:50505,reuseaddr - | P | socat -u - tcp-listen:60606,reuseaddr
其中 P 是您的程序,它在端口 50505 上获取输入并将输出转发到端口 60606。
该示例借用自 将标准输入和标准输出重定向到端口