Add basic UDP message receiving
This commit is contained in:
commit
6196d41c93
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/target
|
23
Cargo.lock
generated
Normal file
23
Cargo.lock
generated
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.2.175"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "panic-halt"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a513e167849a384b7f9b746e517604398518590a9142f4846a32e3c2a4de7b11"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "udp-tests"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"panic-halt",
|
||||||
|
]
|
14
Cargo.toml
Normal file
14
Cargo.toml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
[package]
|
||||||
|
name = "udp-tests"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
libc = { version = "0.2.175", default-features = false }
|
||||||
|
panic-halt = "1.0.0"
|
||||||
|
|
||||||
|
[profile.dev]
|
||||||
|
panic = "abort"
|
||||||
|
|
||||||
|
[build]
|
||||||
|
rustflags = ["-C", "link-args=-lc"]
|
89
src/main.rs
Normal file
89
src/main.rs
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
|
||||||
|
use core::{
|
||||||
|
alloc::{GlobalAlloc, Layout},
|
||||||
|
ffi::CStr,
|
||||||
|
ptr::null_mut,
|
||||||
|
};
|
||||||
|
|
||||||
|
extern crate alloc;
|
||||||
|
|
||||||
|
use alloc::vec::Vec;
|
||||||
|
use panic_halt as _;
|
||||||
|
|
||||||
|
fn handle_error(code: i32, err: &'static core::ffi::CStr) {
|
||||||
|
unsafe {
|
||||||
|
if code == -1 {
|
||||||
|
libc::perror(err.as_ptr());
|
||||||
|
libc::exit(libc::EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MyAllocator;
|
||||||
|
|
||||||
|
unsafe impl GlobalAlloc for MyAllocator {
|
||||||
|
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
|
||||||
|
unsafe { libc::malloc(layout.size()) as *mut u8 }
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
|
||||||
|
unsafe { libc::free(ptr as *mut libc::c_void) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[global_allocator]
|
||||||
|
static GLOBAL: MyAllocator = MyAllocator;
|
||||||
|
|
||||||
|
#[unsafe(no_mangle)]
|
||||||
|
pub extern "C" fn main(_argc: isize, _argv: *const *const u8) -> isize {
|
||||||
|
// Since we are passing a C string the final null character is mandatory
|
||||||
|
unsafe {
|
||||||
|
libc::printf(c"Hello world!\n".as_ptr());
|
||||||
|
|
||||||
|
let socket = libc::socket(libc::AF_INET, libc::SOCK_DGRAM, libc::IPPROTO_UDP);
|
||||||
|
|
||||||
|
let address = libc::sockaddr_in {
|
||||||
|
sin_family: libc::AF_INET as u16,
|
||||||
|
sin_port: libc::htons(8080),
|
||||||
|
sin_addr: libc::in_addr {
|
||||||
|
s_addr: libc::INADDR_ANY,
|
||||||
|
},
|
||||||
|
sin_zero: [0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
};
|
||||||
|
|
||||||
|
handle_error(
|
||||||
|
libc::bind(
|
||||||
|
socket,
|
||||||
|
&raw const address as *const libc::sockaddr,
|
||||||
|
core::mem::size_of::<libc::sockaddr_in>() as u32,
|
||||||
|
),
|
||||||
|
c"bind",
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut otus = Vec::with_capacity(10);
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let buf = libc::malloc(16) as *mut u8;
|
||||||
|
|
||||||
|
let mut other = libc::malloc(core::mem::size_of::<libc::sockaddr_in>());
|
||||||
|
let mut other_size = 0;
|
||||||
|
|
||||||
|
libc::recvfrom(
|
||||||
|
socket,
|
||||||
|
buf as *mut libc::c_void,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
&raw mut other as *mut libc::sockaddr,
|
||||||
|
&mut other_size,
|
||||||
|
);
|
||||||
|
otus.push(*buf);
|
||||||
|
|
||||||
|
libc::printf(c"Data: %s\n".as_ptr(), buf);
|
||||||
|
|
||||||
|
libc::free(buf as *mut libc::c_void);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
0
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user