rust_rsm/rsm/socket/
udpsocket.rs1#![allow(non_camel_case_types)]
2#![allow(non_snake_case)]
3#![allow(non_upper_case_globals)]
4#![allow(dead_code)]
5
6use crate::common::errcode;
7use std::net::{SocketAddr};
8use crate::net_ext::RawFdType;
9use super::*;
10use super::{socketpool};
11
12impl UdpSocket {
15 pub fn new(local_addr:&SocketAddr)->Result<Self,errcode::RESULT> {
16 let af=if local_addr.is_ipv4() {SOCKET_ADDRESS_FAMILY::SOCKET_INET}
17 else { SOCKET_ADDRESS_FAMILY::SOCKET_INET6 };
18 let sock_id = match socketpool::new_socket(af, SOCKET_TYPE::PROTO_DGRAM, net_ext::IpProtos::Ip_Proto_UDP) {
19 Ok(s)=>s,
20 Err(e)=>return Err(e),
21 };
22 let sock = match socketpool::get_socket_by_idx(sock_id) {
23 None=>return Err(errcode::ERROR_INIT_FAILED),
24 Some(s)=>s,
25 };
26 sock.set_reuse_addr(true);
27 let ret = sock.bind(local_addr);
28 if ret!=errcode::RESULT_SUCCESS {
29 return Err(ret)
30 }
31 let udp = Self {
32 sck_idx:sock_id,
33 };
34
35 return Ok(udp)
36 }
37
38 pub fn get_socket_by_id(id:i32)->Self {
39 return Self { sck_idx: id }
40 }
41
42 pub fn set_send_buf_size(&mut self,buf_size:usize)->errcode::RESULT {
43 let sock = match socketpool::get_socket_by_idx(self.sck_idx) {
44 None=>return errcode::ERROR_INVALID_INDEX,
45 Some(s)=>s,
46 };
47 return sock.set_send_buffer(buf_size)
48 }
49
50 pub fn set_recv_buf_size(&mut self,buf_size:usize)->errcode::RESULT {
51 let sock = match socketpool::get_socket_by_idx(self.sck_idx) {
52 None=>return errcode::ERROR_INVALID_INDEX,
53 Some(s)=>s,
54 };
55 return sock.set_recv_buffer(buf_size)
56 }
57
58 pub fn send_to(&mut self,dst:&SocketAddr,buf:&[u8])->Result<usize,errcode::RESULT> {
59 let sock = match socketpool::get_socket_by_idx(self.sck_idx) {
60 None=>return Err(errcode::ERROR_INVALID_INDEX),
61 Some(s)=>s,
62 };
63
64 return sock.send_to(dst, buf)
65 }
66
67 pub fn recv_from(&mut self,buf:&mut [u8])->Result<(usize,SocketAddr),errcode::RESULT> {
68 let sock = match socketpool::get_socket_by_idx(self.sck_idx) {
69 None=>return Err(errcode::ERROR_INVALID_INDEX),
70 Some(s)=>s,
71 };
72
73 return sock.recv_from(buf)
74 }
75
76 pub fn get_local_addr(&self)->Option<SocketAddr> {
77 let sock = match socketpool::get_socket_by_idx(self.sck_idx) {
78 None=>return None,
79 Some(s)=>s,
80 };
81
82 return Some(sock.get_local_addr())
83 }
84
85 pub fn get_socket_id(&self)->i32 {
86 return self.sck_idx
87 }
88
89 pub fn get_os_socket(&self)->RawFdType {
91 let sock = match socketpool::get_socket_by_idx(self.sck_idx) {
92 None=>return 0,
93 Some(s)=>s,
94 };
95
96 return sock.get_raw_fd()
97 }
98
99 pub fn close(&mut self)->errcode::RESULT {
100 socketpool::close_socket(self.sck_idx)
101 }
102
103}