server
监听在 udp4 和 6 的端口, buf大小为2048, 超过的会丢弃。
将接受到的 内容 反转后 发回给客户端
use std::net::UdpSocket;
fn main() -> std::io::Result<()> {
    //let socket = UdpSocket::bind("0.0.0.0:2000")?; // for UDP4
    let socket = UdpSocket::bind("[::]:2000")?;  // for UDP4/6
    let mut buf = [0; 2048];
    loop {
        // Receives a single datagram message on the socket.
        // If `buf` is too small to hold
        // the message, it will be cut off.
        let (amt, src) = socket.recv_from(&mut buf)?;
        // Redeclare `buf` as slice of the received data
	// and send data back to origin.
        let buf = &mut buf[..amt];
        //reverse
        buf.reverse();
        socket.send_to(buf, &src)?;
    }
}
client
use std::io::{self, BufRead};
use std::net::UdpSocket;
use std::env;
use std::str;
fn main() -> std::io::Result<()> {
    let args: Vec = env::args().collect();
    if args.len() < 2 {
        println!("Usage {} hostname", args[0]);
        std::process::exit(1);
    }
    let hostname = &args[1];
    let socket = UdpSocket::bind("[::]:0")?;  // for UDP4/6
    
    socket.connect(hostname.to_string() + &":2000").expect("couldn't connect to address");
    // from https://stackoverflow.com/questions/30186037/how-can-i-read-a-single-line-from-stdin
    let stdin = io::stdin();
    for line in stdin.lock().lines() {
        let line = line.unwrap();
        println!("Line read from stdin '{}'", line);
        if &line == "BYE" {
            break;
        }
        //socket.send_to(line.as_bytes(), hostname.to_string() + &":2000").expect("Error on send");
        socket.send(line.as_bytes()).expect("Error on send");
        let mut buf = [0; 2048];
        let (amt, _src) = socket.recv_from(&mut buf)?;
        let echo = str::from_utf8(&buf[..amt]).unwrap();
        println!("Echo {}", echo);
    }
    
    Ok(())
}
udp的connect 是可以直接接受 “hostname:port” 字符串形式的参数的, 它会自动进行DNS解析
可以互通的python client
import socket 
import sys 
import argparse 
 
data_payload = 2048 
 
def echo_client(server, port): 
    """ A simple echo client """ 
    # Create a UDP socket 
    sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) 
 
    server_address = (server, port) 
    print ("Connecting to %s port %s" % server_address) 
    message = 'This is the message.  It will be repeated.' 
 
    try: 
 
        # Send data 
        message = "Test message. This will be echoed" 
        print ("Sending= %s" % message) 
        sent = sock.sendto(message.encode('utf-8'), server_address) 
 
        # Receive response 
        data, server = sock.recvfrom(data_payload) 
        print ("received= %s" % data) 
 
    finally: 
        print ("Closing connection to the server") 
        sock.close() 
 
if __name__ == '__main__': 
    parser = argparse.ArgumentParser(description='Socket Server Example') 
    parser.add_argument('--port', action="store", dest="port", type=int, required=True) 
    parser.add_argument('--server', action="store", dest="server", type=str, required=True)     
    given_args = parser.parse_args()  
    port = given_args.port
    server = given_args.server
    
    echo_client(server, port) 
服务端
import socket 
import sys 
import argparse 
 
host = '::' 
data_payload = 2048 
 
def echo_server(port): 
    """ A simple echo server """ 
    # Create a UDP socket 
    sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) 
 
    # Bind the socket to the port 
    server_address = (host, port) 
    print ("Starting up echo server on %s port %s" % server_address) 
 
    sock.bind(server_address) 
 
    while True: 
        print ("Waiting to receive message from client") 
        data, address = sock.recvfrom(data_payload) 
     
        print ("received %s bytes from %s" % (len(data), address)) 
        print ("Data: %s" %data) 
     
        if data: 
            data = data[::-1]  # reverse
            sent = sock.sendto(data, address) 
            print ("sent %s bytes back to %s" % (sent, address)) 
 
 
if __name__ == '__main__': 
    parser = argparse.ArgumentParser(description='Socket Server Example')
    parser.add_argument('--port', action="store", dest="port", type=int, required=True) 
    given_args = parser.parse_args()  
    port = given_args.port 
    echo_server(port)