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)