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 }