1 ///
2 module modbus.connection.tcp;
3 
4 import std.socket;
5 public import std.socket : Address, InternetAddress, Internet6Address;
6 version (Posix) public import std.socket : UnixAddress;
7 
8 import modbus.exception;
9 import modbus.connection.base;
10 
11 ///
12 class MasterTcpConnection : Connection
13 {
14     TcpSocket socket;
15 
16     ///
17     this(Address addr)
18     {
19         socket = new TcpSocket();
20         socket.connect(addr);
21         socket.blocking = false;
22     }
23 
24 override:
25     size_t write(const(void)[] msg)
26     {
27         const res = socket.send(msg);
28         if (res == Socket.ERROR)
29             throw modbusException("error while send data to tcp socket");
30         return res;
31     }
32 
33     void[] read(void[] buffer)
34     {
35         const res = socket.receive(buffer);
36         if (res == Socket.ERROR) return buffer[0..0];
37         return buffer[0..res];
38     }
39 }
40 
41 ///
42 class SlaveTcpConnection : Connection
43 {
44     TcpSocket socket;
45     Socket cli;
46 
47     ///
48     this(Address addr)
49     {
50         socket = new TcpSocket();
51         socket.blocking = false;
52         socket.bind(addr);
53         socket.listen(1);
54     }
55 
56 override:
57     size_t write(const(void)[] msg)
58     {
59         if (cli is null) return 0;
60         const res = cli.send(msg);
61         if (res == Socket.ERROR)
62             throw modbusException("error while send data to tcp socket");
63         return res;
64     }
65 
66     void[] read(void[] buffer)
67     {
68         try cli = socket.accept();
69         catch (Exception) return buffer[0..0];
70         if (cli is null) return buffer[0..0];
71         const res = cli.receive(buffer);
72         if (res == Socket.ERROR) return buffer[0..0];
73         return buffer[0..res];
74     }
75 }