簡體   English   中英

Python UDP 服務器收不到數據

[英]Python UDP Server Not Receiving Data

我有 UDP ethe.net 流量,我想在一台機器 (192.168.2.2:7800) 上接收(來自另一台機器 (192.168.2.12))。

通過執行 tcp 轉儲,我可以看到數據在接收機器上流動:

tcpdump -n -i enp5s0f1 udp port 7800
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp5s0f1, link-type EN10MB (Ethernet), capture size 262144 bytes
19:04:13.160763 IP 192.168.2.12.ovbus > 192.168.2.2.asr: UDP, length 1052
19:04:13.170854 IP 192.168.2.12.ovbus > 192.168.2.2.asr: UDP, length 1052

我嘗試使用我從 Radoslaw Matusiak 此處獲得的以下代碼( https://github.com/rsc-dev/pyproxy/blob/ /代碼/pyproxy.py ):

#!/usr/bin/env python

__author__      = 'Radoslaw Matusiak'
__copyright__   = 'Copyright (c) 2016 Radoslaw Matusiak'
__license__     = 'MIT'
__version__     = '0.1'


"""
TCP/UDP proxy.
"""

import argparse
import signal
import logging
import select
import socket


FORMAT = '%(asctime)-15s %(levelname)-10s %(message)s'
logging.basicConfig(format=FORMAT)
LOGGER = logging.getLogger()

LOCAL_DATA_HANDLER = lambda x:x
REMOTE_DATA_HANDLER = lambda x:x

BUFFER_SIZE = 2 ** 10  # 1024. Keep buffer size as power of 2.


def udp_proxy(src, dst):
    """Run UDP proxy.
    
    Arguments:
    src -- Source IP address and port string. I.e.: '127.0.0.1:8000'
    dst -- Destination IP address and port. I.e.: '127.0.0.1:8888'
    """
    LOGGER.debug('Starting UDP proxy...')
    LOGGER.debug('Src: {}'.format(src))
    LOGGER.debug('Dst: {}'.format(dst))
    
    proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    proxy_socket.bind(ip_to_tuple(src))
    
    client_address = None
    server_address = ip_to_tuple(dst)
    
    LOGGER.debug('Looping proxy (press Ctrl-Break to stop)...')
    while True:
        data, address = proxy_socket.recvfrom(BUFFER_SIZE)
        LOGGER.debug('Data Received')
        
        if client_address == None:
            client_address = address

        if address == client_address:
            data = LOCAL_DATA_HANDLER(data)
            proxy_socket.sendto(data, server_address)
        elif address == server_address:
            data = REMOTE_DATA_HANDLER(data)
            proxy_socket.sendto(data, client_address)
            client_address = None
        else:
            LOGGER.warning('Unknown address: {}'.format(str(address)))
# end-of-function udp_proxy    
    
    
def tcp_proxy(src, dst):
    """Run TCP proxy.
    
    Arguments:
    src -- Source IP address and port string. I.e.: '127.0.0.1:8000'
    dst -- Destination IP address and port. I.e.: '127.0.0.1:8888'
    """
    LOGGER.debug('Starting TCP proxy...')
    LOGGER.debug('Src: {}'.format(src))
    LOGGER.debug('Dst: {}'.format(dst))
    
    sockets = []
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(ip_to_tuple(src))
    s.listen(1)

    s_src, _ = s.accept()

    s_dst = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s_dst.connect(ip_to_tuple(dst)) 
    
    sockets.append(s_src)
    sockets.append(s_dst)
    
    while True:
        s_read, _, _ = select.select(sockets, [], [])
        
        for s in s_read:
            data = s.recv(BUFFER_SIZE)
        
            if s == s_src:
                d = LOCAL_DATA_HANDLER(data)
                s_dst.sendall(d)
            elif s == s_dst:
                d = REMOTE_DATA_HANDLER(data)
                s_src.sendall(d)
# end-of-function tcp_proxy    


def ip_to_tuple(ip):
    """Parse IP string and return (ip, port) tuple.
    
    Arguments:
    ip -- IP address:port string. I.e.: '127.0.0.1:8000'.
    """
    ip, port = ip.split(':')
    return (ip, int(port))
# end-of-function ip_to_tuple


def main():
    """Main method."""
    parser = argparse.ArgumentParser(description='TCP/UPD proxy.')
    
    # TCP UPD groups
    proto_group = parser.add_mutually_exclusive_group(required=True)
    proto_group.add_argument('--tcp', action='store_true', help='TCP proxy')
    proto_group.add_argument('--udp', action='store_true', help='UDP proxy')
    
    parser.add_argument('-s', '--src', required=True, help='Source IP and port, i.e.: 127.0.0.1:8000')
    parser.add_argument('-d', '--dst', required=True, help='Destination IP and port, i.e.: 127.0.0.1:8888')
    
    output_group = parser.add_mutually_exclusive_group()
    output_group.add_argument('-q', '--quiet', action='store_true', help='Be quiet')
    output_group.add_argument('-v', '--verbose', action='store_true', help='Be loud')
    
    args = parser.parse_args()
    
    if args.quiet:
        LOGGER.setLevel(logging.CRITICAL)
    if args.verbose:
        LOGGER.setLevel(logging.NOTSET)
    
    if args.udp:
        udp_proxy(args.src, args.dst)
    elif args.tcp:
        tcp_proxy(args.src, args.dst)
# end-of-function main    


if __name__ == '__main__':
    main()

但是,當我運行命令 testpyProxy.py --udp -d 192.168.2.13:7800 -s 192.168.2.2:7800 時,我從未收到:

2009-01-23 19:11:38,786 DEBUG      BUFFER SIZE: 32768
2009-01-23 19:11:38,786 DEBUG      Starting UDP proxy...
2009-01-23 19:11:38,786 DEBUG      Src: 192.168.2.2:7800
2009-01-23 19:11:38,786 DEBUG      Dst: 192.168.2.12:7800
2009-01-23 19:11:38,787 DEBUG      Looping proxy (press Ctrl-Break to stop)...

這個 python 代理運行在 Centos 7 (192.168.2.2) 機器上,帶有來自 ifconfig 的 ethe.net 端口連接統計信息:

enp5s0f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9000
        inet 192.168.2.2  netmask 255.255.255.0  broadcast 192.168.2.255
        inet6 fe80::21b:acff:fe02:af29  prefixlen 64  scopeid 0x20<link>
        ether 00:1b:ac:02:af:29  txqueuelen 1000  (Ethernet)
        RX packets 206136919  bytes 494683048962 (460.7 GiB)
        RX errors 0  dropped 50795  overruns 0  frame 0
        TX packets 1018446  bytes 564508158 (538.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

任何幫助是極大的贊賞。

更新:

多虧了 tdelaney 的建議,我已經簡化了我正在運行的代碼。 在服務器端(192.168.2.2 機器)我正在運行以下代碼:

#! /usr/bin/python3
import socket
BUFFER_SIZE = 2 ** 9  # 1024. Keep buffer size as power of 2.
proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
proxy_socket.bind(("192.168.2.2", 7900))
while True:
    data, address = proxy_socket.recvfrom(BUFFER_SIZE)
    print('received')

在客戶端(來自 192.168.2.12 機器)我正在運行這段代碼:

#! /usr/bin/python3
import socket
msgFromClient       = "Hello UDP Server"
bytesToSend         = str.encode(msgFromClient)
serverAddressPort   = ("192.168.2.2", 7900)
bufferSize          = 1024
# Create a UDP socket at client side
UDPClientSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
# Send to server using created UDP socket
UDPClientSocket.sendto(bytesToSend, serverAddressPort)
print('sent')

我仍然得到與以前相同的結果。 即使我有證據(通過 tcp 轉儲)數據已發送,也沒有收到數據。

SOLUTION:看起來有一個防火牆問題阻止了端口被監控。 以下是我用來添加端口的命令:

--Adds the port to the firewall
firewall-cmd --permanent --add-port=7800/udp
--restart the firewall service for the port to take effect
systemctl restart firewalld

SOLUTION:看起來有一個防火牆問題阻止了端口被監控。 以下是我用來添加端口的命令:

--Adds the port to the firewall
firewall-cmd --permanent --add-port=7800/udp
--restart the firewall service for the port to take effect
systemctl restart firewalld

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM