rust_rsm/rsm/socket/
udpsocket.rs

1#![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
12///UdpSocket API Implementation
13/// the default socket implementation is aynchronous socket, do not require the app to set non-blocking mode
14impl 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    ///get underlying os raw socket id
90    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}