1 //! `tcpstream` provide an interface to establish tcp socket client.
2
3 use crate::{Handle, IpAddress};
4
5 extern "Rust" {
sys_tcp_stream_connect(ip: &[u8], port: u16, timeout: Option<u64>) -> Result<Handle, ()>6 fn sys_tcp_stream_connect(ip: &[u8], port: u16, timeout: Option<u64>) -> Result<Handle, ()>;
sys_tcp_stream_close(handle: Handle) -> Result<(), ()>7 fn sys_tcp_stream_close(handle: Handle) -> Result<(), ()>;
sys_tcp_stream_read(handle: Handle, buffer: &mut [u8]) -> Result<usize, ()>8 fn sys_tcp_stream_read(handle: Handle, buffer: &mut [u8]) -> Result<usize, ()>;
sys_tcp_stream_write(handle: Handle, buffer: &[u8]) -> Result<usize, ()>9 fn sys_tcp_stream_write(handle: Handle, buffer: &[u8]) -> Result<usize, ()>;
sys_tcp_stream_set_read_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()>10 fn sys_tcp_stream_set_read_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()>;
sys_tcp_stream_get_read_timeout(handle: Handle) -> Result<Option<u64>, ()>11 fn sys_tcp_stream_get_read_timeout(handle: Handle) -> Result<Option<u64>, ()>;
sys_tcp_stream_set_write_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()>12 fn sys_tcp_stream_set_write_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()>;
sys_tcp_stream_get_write_timeout(handle: Handle) -> Result<Option<u64>, ()>13 fn sys_tcp_stream_get_write_timeout(handle: Handle) -> Result<Option<u64>, ()>;
sys_tcp_stream_peek(handle: Handle, buf: &mut [u8]) -> Result<usize, ()>14 fn sys_tcp_stream_peek(handle: Handle, buf: &mut [u8]) -> Result<usize, ()>;
sys_tcp_stream_set_nonblocking(handle: Handle, mode: bool) -> Result<(), ()>15 fn sys_tcp_stream_set_nonblocking(handle: Handle, mode: bool) -> Result<(), ()>;
sys_tcp_stream_set_tll(handle: Handle, ttl: u32) -> Result<(), ()>16 fn sys_tcp_stream_set_tll(handle: Handle, ttl: u32) -> Result<(), ()>;
sys_tcp_stream_get_tll(handle: Handle) -> Result<u32, ()>17 fn sys_tcp_stream_get_tll(handle: Handle) -> Result<u32, ()>;
sys_tcp_stream_shutdown(handle: Handle, how: i32) -> Result<(), ()>18 fn sys_tcp_stream_shutdown(handle: Handle, how: i32) -> Result<(), ()>;
sys_tcp_stream_peer_addr(handle: Handle) -> Result<(IpAddress, u16), ()>19 fn sys_tcp_stream_peer_addr(handle: Handle) -> Result<(IpAddress, u16), ()>;
20 }
21
22 /// Opens a TCP connection to a remote host.
23 #[inline(always)]
connect(ip: &[u8], port: u16, timeout: Option<u64>) -> Result<Handle, ()>24 pub fn connect(ip: &[u8], port: u16, timeout: Option<u64>) -> Result<Handle, ()> {
25 unsafe { sys_tcp_stream_connect(ip, port, timeout) }
26 }
27
28 /// Close a TCP connection
29 #[inline(always)]
close(handle: Handle) -> Result<(), ()>30 pub fn close(handle: Handle) -> Result<(), ()> {
31 unsafe { sys_tcp_stream_close(handle) }
32 }
33
34 #[inline(always)]
peek(handle: Handle, buf: &mut [u8]) -> Result<usize, ()>35 pub fn peek(handle: Handle, buf: &mut [u8]) -> Result<usize, ()> {
36 unsafe { sys_tcp_stream_peek(handle, buf) }
37 }
38
39 #[inline(always)]
peer_addr(handle: Handle) -> Result<(IpAddress, u16), ()>40 pub fn peer_addr(handle: Handle) -> Result<(IpAddress, u16), ()> {
41 unsafe { sys_tcp_stream_peer_addr(handle) }
42 }
43 #[inline(always)]
read(handle: Handle, buffer: &mut [u8]) -> Result<usize, ()>44 pub fn read(handle: Handle, buffer: &mut [u8]) -> Result<usize, ()> {
45 unsafe { sys_tcp_stream_read(handle, buffer) }
46 }
47
48 #[inline(always)]
write(handle: Handle, buffer: &[u8]) -> Result<usize, ()>49 pub fn write(handle: Handle, buffer: &[u8]) -> Result<usize, ()> {
50 unsafe { sys_tcp_stream_write(handle, buffer) }
51 }
52
53 #[inline(always)]
set_read_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()>54 pub fn set_read_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()> {
55 unsafe { sys_tcp_stream_set_read_timeout(handle, timeout) }
56 }
57
58 #[inline(always)]
set_write_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()>59 pub fn set_write_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()> {
60 unsafe { sys_tcp_stream_set_write_timeout(handle, timeout) }
61 }
62
63 #[inline(always)]
get_read_timeout(handle: Handle) -> Result<Option<u64>, ()>64 pub fn get_read_timeout(handle: Handle) -> Result<Option<u64>, ()> {
65 unsafe { sys_tcp_stream_get_read_timeout(handle) }
66 }
67
68 #[inline(always)]
get_write_timeout(handle: Handle) -> Result<Option<u64>, ()>69 pub fn get_write_timeout(handle: Handle) -> Result<Option<u64>, ()> {
70 unsafe { sys_tcp_stream_get_write_timeout(handle) }
71 }
72
73 #[inline(always)]
set_nodelay(_: Handle, mode: bool) -> Result<(), ()>74 pub fn set_nodelay(_: Handle, mode: bool) -> Result<(), ()> {
75 // smoltcp does not support Nagle's algorithm
76 // => to enable Nagle's algorithm isn't possible
77 if mode {
78 Ok(())
79 } else {
80 Err(())
81 }
82 }
83
84 #[inline(always)]
nodelay(_: Handle) -> Result<bool, ()>85 pub fn nodelay(_: Handle) -> Result<bool, ()> {
86 // smoltcp does not support Nagle's algorithm
87 // => return always true
88 Ok(true)
89 }
90
91 #[inline(always)]
set_nonblocking(handle: Handle, mode: bool) -> Result<(), ()>92 pub fn set_nonblocking(handle: Handle, mode: bool) -> Result<(), ()> {
93 unsafe { sys_tcp_stream_set_nonblocking(handle, mode) }
94 }
95
96 #[inline(always)]
set_tll(handle: Handle, ttl: u32) -> Result<(), ()>97 pub fn set_tll(handle: Handle, ttl: u32) -> Result<(), ()> {
98 unsafe { sys_tcp_stream_set_tll(handle, ttl) }
99 }
100
101 #[inline(always)]
get_tll(handle: Handle) -> Result<u32, ()>102 pub fn get_tll(handle: Handle) -> Result<u32, ()> {
103 unsafe { sys_tcp_stream_get_tll(handle) }
104 }
105
106 #[inline(always)]
shutdown(handle: Handle, how: i32) -> Result<(), ()>107 pub fn shutdown(handle: Handle, how: i32) -> Result<(), ()> {
108 unsafe { sys_tcp_stream_shutdown(handle, how) }
109 }
110