A Simple TCP & UDP Socket Library. An update from that of Hiroshi Yamaguchi.
SimpleSocket.h@0:1e4a74c2c16f, 2012-05-23 (annotated)
- Committer:
- macgyveremir
- Date:
- Wed May 23 16:26:44 2012 +0000
- Revision:
- 0:1e4a74c2c16f
Fixed dropping of null bytes (0x00) from incoming binary TCP frames
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
macgyveremir | 0:1e4a74c2c16f | 1 | /* |
macgyveremir | 0:1e4a74c2c16f | 2 | Copyright (c) 2011, Senio Networks, Inc. |
macgyveremir | 0:1e4a74c2c16f | 3 | |
macgyveremir | 0:1e4a74c2c16f | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy |
macgyveremir | 0:1e4a74c2c16f | 5 | of this software and associated documentation files (the "Software"), to deal |
macgyveremir | 0:1e4a74c2c16f | 6 | in the Software without restriction, including without limitation the rights |
macgyveremir | 0:1e4a74c2c16f | 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
macgyveremir | 0:1e4a74c2c16f | 8 | copies of the Software, and to permit persons to whom the Software is |
macgyveremir | 0:1e4a74c2c16f | 9 | furnished to do so, subject to the following conditions: |
macgyveremir | 0:1e4a74c2c16f | 10 | |
macgyveremir | 0:1e4a74c2c16f | 11 | The above copyright notice and this permission notice shall be included in |
macgyveremir | 0:1e4a74c2c16f | 12 | all copies or substantial portions of the Software. |
macgyveremir | 0:1e4a74c2c16f | 13 | |
macgyveremir | 0:1e4a74c2c16f | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
macgyveremir | 0:1e4a74c2c16f | 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
macgyveremir | 0:1e4a74c2c16f | 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
macgyveremir | 0:1e4a74c2c16f | 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
macgyveremir | 0:1e4a74c2c16f | 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
macgyveremir | 0:1e4a74c2c16f | 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
macgyveremir | 0:1e4a74c2c16f | 20 | THE SOFTWARE. |
macgyveremir | 0:1e4a74c2c16f | 21 | */ |
macgyveremir | 0:1e4a74c2c16f | 22 | |
macgyveremir | 0:1e4a74c2c16f | 23 | #ifndef SIMPLE_SOCKET_H |
macgyveremir | 0:1e4a74c2c16f | 24 | #define SIMPLE_SOCKET_H |
macgyveremir | 0:1e4a74c2c16f | 25 | |
macgyveremir | 0:1e4a74c2c16f | 26 | #include "mbed.h" |
macgyveremir | 0:1e4a74c2c16f | 27 | #include "TCPSocket.h" |
macgyveremir | 0:1e4a74c2c16f | 28 | #include "UDPSocket.h" |
macgyveremir | 0:1e4a74c2c16f | 29 | #include "DNSRequest.h" |
macgyveremir | 0:1e4a74c2c16f | 30 | #include "Debug.h" |
macgyveremir | 0:1e4a74c2c16f | 31 | |
macgyveremir | 0:1e4a74c2c16f | 32 | /** |
macgyveremir | 0:1e4a74c2c16f | 33 | * wrapper class of TCPSocketEvent |
macgyveremir | 0:1e4a74c2c16f | 34 | */ |
macgyveremir | 0:1e4a74c2c16f | 35 | class SocketEvent { |
macgyveremir | 0:1e4a74c2c16f | 36 | public: |
macgyveremir | 0:1e4a74c2c16f | 37 | /** |
macgyveremir | 0:1e4a74c2c16f | 38 | * creates a SocketEvent wrapper object. |
macgyveremir | 0:1e4a74c2c16f | 39 | * |
macgyveremir | 0:1e4a74c2c16f | 40 | * @param event TCP socket event number |
macgyveremir | 0:1e4a74c2c16f | 41 | */ |
macgyveremir | 0:1e4a74c2c16f | 42 | SocketEvent(TCPSocketEvent event); |
macgyveremir | 0:1e4a74c2c16f | 43 | |
macgyveremir | 0:1e4a74c2c16f | 44 | /** |
macgyveremir | 0:1e4a74c2c16f | 45 | * @returns a string representation of the event |
macgyveremir | 0:1e4a74c2c16f | 46 | */ |
macgyveremir | 0:1e4a74c2c16f | 47 | char *toString(); |
macgyveremir | 0:1e4a74c2c16f | 48 | |
macgyveremir | 0:1e4a74c2c16f | 49 | /** |
macgyveremir | 0:1e4a74c2c16f | 50 | * an operator overloading for toString() |
macgyveremir | 0:1e4a74c2c16f | 51 | */ |
macgyveremir | 0:1e4a74c2c16f | 52 | operator char *(); |
macgyveremir | 0:1e4a74c2c16f | 53 | |
macgyveremir | 0:1e4a74c2c16f | 54 | /** |
macgyveremir | 0:1e4a74c2c16f | 55 | * an operator overloading for TCP socket event number |
macgyveremir | 0:1e4a74c2c16f | 56 | */ |
macgyveremir | 0:1e4a74c2c16f | 57 | operator int(); |
macgyveremir | 0:1e4a74c2c16f | 58 | |
macgyveremir | 0:1e4a74c2c16f | 59 | private: |
macgyveremir | 0:1e4a74c2c16f | 60 | TCPSocketEvent event; |
macgyveremir | 0:1e4a74c2c16f | 61 | }; |
macgyveremir | 0:1e4a74c2c16f | 62 | |
macgyveremir | 0:1e4a74c2c16f | 63 | /** |
macgyveremir | 0:1e4a74c2c16f | 64 | * wrapper class of TCPSocketErr |
macgyveremir | 0:1e4a74c2c16f | 65 | */ |
macgyveremir | 0:1e4a74c2c16f | 66 | class SocketError { |
macgyveremir | 0:1e4a74c2c16f | 67 | public: |
macgyveremir | 0:1e4a74c2c16f | 68 | /** |
macgyveremir | 0:1e4a74c2c16f | 69 | * creates a SocketError wrapper object. |
macgyveremir | 0:1e4a74c2c16f | 70 | * |
macgyveremir | 0:1e4a74c2c16f | 71 | * @param err TCP socket error number |
macgyveremir | 0:1e4a74c2c16f | 72 | */ |
macgyveremir | 0:1e4a74c2c16f | 73 | SocketError(TCPSocketErr err); |
macgyveremir | 0:1e4a74c2c16f | 74 | |
macgyveremir | 0:1e4a74c2c16f | 75 | /** |
macgyveremir | 0:1e4a74c2c16f | 76 | * @returns a string representation of the error |
macgyveremir | 0:1e4a74c2c16f | 77 | */ |
macgyveremir | 0:1e4a74c2c16f | 78 | char *toString(); |
macgyveremir | 0:1e4a74c2c16f | 79 | |
macgyveremir | 0:1e4a74c2c16f | 80 | /** |
macgyveremir | 0:1e4a74c2c16f | 81 | * an operator overloading for toString(). |
macgyveremir | 0:1e4a74c2c16f | 82 | */ |
macgyveremir | 0:1e4a74c2c16f | 83 | operator char *(); |
macgyveremir | 0:1e4a74c2c16f | 84 | |
macgyveremir | 0:1e4a74c2c16f | 85 | /** |
macgyveremir | 0:1e4a74c2c16f | 86 | * an operator overloading for TCP socket error number. |
macgyveremir | 0:1e4a74c2c16f | 87 | */ |
macgyveremir | 0:1e4a74c2c16f | 88 | operator int(); |
macgyveremir | 0:1e4a74c2c16f | 89 | |
macgyveremir | 0:1e4a74c2c16f | 90 | private: |
macgyveremir | 0:1e4a74c2c16f | 91 | TCPSocketErr err; |
macgyveremir | 0:1e4a74c2c16f | 92 | }; |
macgyveremir | 0:1e4a74c2c16f | 93 | |
macgyveremir | 0:1e4a74c2c16f | 94 | /** |
macgyveremir | 0:1e4a74c2c16f | 95 | * wrapper class of UDPSocketEvent |
macgyveremir | 0:1e4a74c2c16f | 96 | */ |
macgyveremir | 0:1e4a74c2c16f | 97 | class DatagramEvent { |
macgyveremir | 0:1e4a74c2c16f | 98 | public: |
macgyveremir | 0:1e4a74c2c16f | 99 | /** |
macgyveremir | 0:1e4a74c2c16f | 100 | * creates a DatagramEvent wrapper object. |
macgyveremir | 0:1e4a74c2c16f | 101 | * |
macgyveremir | 0:1e4a74c2c16f | 102 | * @param event UDP socket event number |
macgyveremir | 0:1e4a74c2c16f | 103 | */ |
macgyveremir | 0:1e4a74c2c16f | 104 | DatagramEvent(UDPSocketEvent event); |
macgyveremir | 0:1e4a74c2c16f | 105 | |
macgyveremir | 0:1e4a74c2c16f | 106 | /** |
macgyveremir | 0:1e4a74c2c16f | 107 | * @returns a string representation of the event |
macgyveremir | 0:1e4a74c2c16f | 108 | */ |
macgyveremir | 0:1e4a74c2c16f | 109 | char *toString(); |
macgyveremir | 0:1e4a74c2c16f | 110 | |
macgyveremir | 0:1e4a74c2c16f | 111 | /** |
macgyveremir | 0:1e4a74c2c16f | 112 | * an operator overloading for toString() |
macgyveremir | 0:1e4a74c2c16f | 113 | */ |
macgyveremir | 0:1e4a74c2c16f | 114 | operator char *(); |
macgyveremir | 0:1e4a74c2c16f | 115 | |
macgyveremir | 0:1e4a74c2c16f | 116 | /** |
macgyveremir | 0:1e4a74c2c16f | 117 | * an operator overloading for UDP socket event number |
macgyveremir | 0:1e4a74c2c16f | 118 | */ |
macgyveremir | 0:1e4a74c2c16f | 119 | operator int(); |
macgyveremir | 0:1e4a74c2c16f | 120 | |
macgyveremir | 0:1e4a74c2c16f | 121 | private: |
macgyveremir | 0:1e4a74c2c16f | 122 | UDPSocketEvent event; |
macgyveremir | 0:1e4a74c2c16f | 123 | }; |
macgyveremir | 0:1e4a74c2c16f | 124 | |
macgyveremir | 0:1e4a74c2c16f | 125 | /** |
macgyveremir | 0:1e4a74c2c16f | 126 | * wrapper class of UDPSocketErr |
macgyveremir | 0:1e4a74c2c16f | 127 | */ |
macgyveremir | 0:1e4a74c2c16f | 128 | class DatagramError { |
macgyveremir | 0:1e4a74c2c16f | 129 | public: |
macgyveremir | 0:1e4a74c2c16f | 130 | /** |
macgyveremir | 0:1e4a74c2c16f | 131 | * creates a DatagramError wrapper object. |
macgyveremir | 0:1e4a74c2c16f | 132 | * |
macgyveremir | 0:1e4a74c2c16f | 133 | * @param err UDP socket error number |
macgyveremir | 0:1e4a74c2c16f | 134 | */ |
macgyveremir | 0:1e4a74c2c16f | 135 | DatagramError(UDPSocketErr err); |
macgyveremir | 0:1e4a74c2c16f | 136 | |
macgyveremir | 0:1e4a74c2c16f | 137 | /** |
macgyveremir | 0:1e4a74c2c16f | 138 | * @returns a string representation of the error |
macgyveremir | 0:1e4a74c2c16f | 139 | */ |
macgyveremir | 0:1e4a74c2c16f | 140 | char *toString(); |
macgyveremir | 0:1e4a74c2c16f | 141 | |
macgyveremir | 0:1e4a74c2c16f | 142 | /** |
macgyveremir | 0:1e4a74c2c16f | 143 | * an operator overloading for toString(). |
macgyveremir | 0:1e4a74c2c16f | 144 | */ |
macgyveremir | 0:1e4a74c2c16f | 145 | operator char *(); |
macgyveremir | 0:1e4a74c2c16f | 146 | |
macgyveremir | 0:1e4a74c2c16f | 147 | /** |
macgyveremir | 0:1e4a74c2c16f | 148 | * an operator overloading for UDP socket error number. |
macgyveremir | 0:1e4a74c2c16f | 149 | */ |
macgyveremir | 0:1e4a74c2c16f | 150 | operator int(); |
macgyveremir | 0:1e4a74c2c16f | 151 | |
macgyveremir | 0:1e4a74c2c16f | 152 | private: |
macgyveremir | 0:1e4a74c2c16f | 153 | UDPSocketErr err; |
macgyveremir | 0:1e4a74c2c16f | 154 | }; |
macgyveremir | 0:1e4a74c2c16f | 155 | |
macgyveremir | 0:1e4a74c2c16f | 156 | /** |
macgyveremir | 0:1e4a74c2c16f | 157 | * client socket class for communication endpoint |
macgyveremir | 0:1e4a74c2c16f | 158 | */ |
macgyveremir | 0:1e4a74c2c16f | 159 | class ClientSocket { |
macgyveremir | 0:1e4a74c2c16f | 160 | friend class ServerSocket; |
macgyveremir | 0:1e4a74c2c16f | 161 | |
macgyveremir | 0:1e4a74c2c16f | 162 | public: |
macgyveremir | 0:1e4a74c2c16f | 163 | /** |
macgyveremir | 0:1e4a74c2c16f | 164 | * creates a ClientSocket object. |
macgyveremir | 0:1e4a74c2c16f | 165 | * |
macgyveremir | 0:1e4a74c2c16f | 166 | * @param ip IP address of the socket |
macgyveremir | 0:1e4a74c2c16f | 167 | * @param port port number of the socket |
macgyveremir | 0:1e4a74c2c16f | 168 | * @param timeout max waiting time until connected |
macgyveremir | 0:1e4a74c2c16f | 169 | * @param debug set true to display debugging information |
macgyveremir | 0:1e4a74c2c16f | 170 | */ |
macgyveremir | 0:1e4a74c2c16f | 171 | ClientSocket(IpAddr ip, int port, float timeout = 60, bool debug = false); |
macgyveremir | 0:1e4a74c2c16f | 172 | |
macgyveremir | 0:1e4a74c2c16f | 173 | /** |
macgyveremir | 0:1e4a74c2c16f | 174 | * creates a ClientSocket object. |
macgyveremir | 0:1e4a74c2c16f | 175 | * |
macgyveremir | 0:1e4a74c2c16f | 176 | * @param hostname domain/host name of the socket |
macgyveremir | 0:1e4a74c2c16f | 177 | * @param port port number of the socket |
macgyveremir | 0:1e4a74c2c16f | 178 | * @param timeout max waiting time until connected |
macgyveremir | 0:1e4a74c2c16f | 179 | * @param debug set true to display debugging information |
macgyveremir | 0:1e4a74c2c16f | 180 | */ |
macgyveremir | 0:1e4a74c2c16f | 181 | ClientSocket(char *hostname, int port, float timeout = 60, bool debug = false); |
macgyveremir | 0:1e4a74c2c16f | 182 | |
macgyveremir | 0:1e4a74c2c16f | 183 | |
macgyveremir | 0:1e4a74c2c16f | 184 | /** |
macgyveremir | 0:1e4a74c2c16f | 185 | * copy constructor |
macgyveremir | 0:1e4a74c2c16f | 186 | */ |
macgyveremir | 0:1e4a74c2c16f | 187 | ClientSocket(const ClientSocket& that); |
macgyveremir | 0:1e4a74c2c16f | 188 | |
macgyveremir | 0:1e4a74c2c16f | 189 | /** |
macgyveremir | 0:1e4a74c2c16f | 190 | * gets the IP address. |
macgyveremir | 0:1e4a74c2c16f | 191 | * |
macgyveremir | 0:1e4a74c2c16f | 192 | * @returns IP address of the socket |
macgyveremir | 0:1e4a74c2c16f | 193 | */ |
macgyveremir | 0:1e4a74c2c16f | 194 | IpAddr getIp(); |
macgyveremir | 0:1e4a74c2c16f | 195 | |
macgyveremir | 0:1e4a74c2c16f | 196 | /** |
macgyveremir | 0:1e4a74c2c16f | 197 | * gets the connection status. |
macgyveremir | 0:1e4a74c2c16f | 198 | * |
macgyveremir | 0:1e4a74c2c16f | 199 | * @returns true if connected, false otherwise |
macgyveremir | 0:1e4a74c2c16f | 200 | */ |
macgyveremir | 0:1e4a74c2c16f | 201 | bool connected(); |
macgyveremir | 0:1e4a74c2c16f | 202 | |
macgyveremir | 0:1e4a74c2c16f | 203 | /** |
macgyveremir | 0:1e4a74c2c16f | 204 | * tests if input data available or not. |
macgyveremir | 0:1e4a74c2c16f | 205 | * |
macgyveremir | 0:1e4a74c2c16f | 206 | * @returns true if incomming data available, false otherwise |
macgyveremir | 0:1e4a74c2c16f | 207 | */ |
macgyveremir | 0:1e4a74c2c16f | 208 | bool available(); |
macgyveremir | 0:1e4a74c2c16f | 209 | |
macgyveremir | 0:1e4a74c2c16f | 210 | /** |
macgyveremir | 0:1e4a74c2c16f | 211 | * reads a char. |
macgyveremir | 0:1e4a74c2c16f | 212 | * |
macgyveremir | 0:1e4a74c2c16f | 213 | * @returns a char from the socket input stream, or -1 if no data available |
macgyveremir | 0:1e4a74c2c16f | 214 | */ |
macgyveremir | 0:1e4a74c2c16f | 215 | int read(); |
macgyveremir | 0:1e4a74c2c16f | 216 | |
macgyveremir | 0:1e4a74c2c16f | 217 | /** |
macgyveremir | 0:1e4a74c2c16f | 218 | * reads data into the specified buffer. |
macgyveremir | 0:1e4a74c2c16f | 219 | * |
macgyveremir | 0:1e4a74c2c16f | 220 | * @param buf input buffer |
macgyveremir | 0:1e4a74c2c16f | 221 | * @param size size of the buffer |
macgyveremir | 0:1e4a74c2c16f | 222 | * |
macgyveremir | 0:1e4a74c2c16f | 223 | * @returns the size of the data read |
macgyveremir | 0:1e4a74c2c16f | 224 | */ |
macgyveremir | 0:1e4a74c2c16f | 225 | int read(char *buf, int size); |
macgyveremir | 0:1e4a74c2c16f | 226 | |
macgyveremir | 0:1e4a74c2c16f | 227 | /** |
macgyveremir | 0:1e4a74c2c16f | 228 | * scans input stream according to the specified format string. |
macgyveremir | 0:1e4a74c2c16f | 229 | * |
macgyveremir | 0:1e4a74c2c16f | 230 | * @params format scanf format string, corresponding arguments follow |
macgyveremir | 0:1e4a74c2c16f | 231 | * |
macgyveremir | 0:1e4a74c2c16f | 232 | * @returns number of input items assigned |
macgyveremir | 0:1e4a74c2c16f | 233 | */ |
macgyveremir | 0:1e4a74c2c16f | 234 | int scanf(const char *format, ...); |
macgyveremir | 0:1e4a74c2c16f | 235 | |
macgyveremir | 0:1e4a74c2c16f | 236 | /** |
macgyveremir | 0:1e4a74c2c16f | 237 | * writes a char to the output stream. |
macgyveremir | 0:1e4a74c2c16f | 238 | * |
macgyveremir | 0:1e4a74c2c16f | 239 | * @param c a char to be written to the socket output stream |
macgyveremir | 0:1e4a74c2c16f | 240 | * |
macgyveremir | 0:1e4a74c2c16f | 241 | * @returns positive int if succeeded, or -1 if failed |
macgyveremir | 0:1e4a74c2c16f | 242 | */ |
macgyveremir | 0:1e4a74c2c16f | 243 | int write(char c); |
macgyveremir | 0:1e4a74c2c16f | 244 | |
macgyveremir | 0:1e4a74c2c16f | 245 | /** |
macgyveremir | 0:1e4a74c2c16f | 246 | * writes an array of chars to the output stream. |
macgyveremir | 0:1e4a74c2c16f | 247 | * |
macgyveremir | 0:1e4a74c2c16f | 248 | * @param buf an array of chars to be written to the socket output stream |
macgyveremir | 0:1e4a74c2c16f | 249 | * @param size number of chars in the array |
macgyveremir | 0:1e4a74c2c16f | 250 | * |
macgyveremir | 0:1e4a74c2c16f | 251 | * @returns number of chars written, or -1 if failed |
macgyveremir | 0:1e4a74c2c16f | 252 | */ |
macgyveremir | 0:1e4a74c2c16f | 253 | int write(char *buf, int size); |
macgyveremir | 0:1e4a74c2c16f | 254 | |
macgyveremir | 0:1e4a74c2c16f | 255 | /** |
macgyveremir | 0:1e4a74c2c16f | 256 | * prints the data to the socket output stream according to the specified format string. |
macgyveremir | 0:1e4a74c2c16f | 257 | * |
macgyveremir | 0:1e4a74c2c16f | 258 | * @param format printf format string, corresponding arguments follow |
macgyveremir | 0:1e4a74c2c16f | 259 | * |
macgyveremir | 0:1e4a74c2c16f | 260 | * @returns number of chars written, or -1 if failed |
macgyveremir | 0:1e4a74c2c16f | 261 | */ |
macgyveremir | 0:1e4a74c2c16f | 262 | int printf(const char *format, ...); |
macgyveremir | 0:1e4a74c2c16f | 263 | |
macgyveremir | 0:1e4a74c2c16f | 264 | /** |
macgyveremir | 0:1e4a74c2c16f | 265 | * closes the connection. |
macgyveremir | 0:1e4a74c2c16f | 266 | */ |
macgyveremir | 0:1e4a74c2c16f | 267 | void close(); |
macgyveremir | 0:1e4a74c2c16f | 268 | |
macgyveremir | 0:1e4a74c2c16f | 269 | /** |
macgyveremir | 0:1e4a74c2c16f | 270 | * sets debug mode. |
macgyveremir | 0:1e4a74c2c16f | 271 | * |
macgyveremir | 0:1e4a74c2c16f | 272 | * @param debug true to display debugging information |
macgyveremir | 0:1e4a74c2c16f | 273 | */ |
macgyveremir | 0:1e4a74c2c16f | 274 | void setDebug(bool debug); |
macgyveremir | 0:1e4a74c2c16f | 275 | |
macgyveremir | 0:1e4a74c2c16f | 276 | /** |
macgyveremir | 0:1e4a74c2c16f | 277 | * an operator shorthand for connected() |
macgyveremir | 0:1e4a74c2c16f | 278 | */ |
macgyveremir | 0:1e4a74c2c16f | 279 | operator bool(); |
macgyveremir | 0:1e4a74c2c16f | 280 | |
macgyveremir | 0:1e4a74c2c16f | 281 | private: |
macgyveremir | 0:1e4a74c2c16f | 282 | enum ConnectionState {CONNECTING, CONNECTED, DISCONNECTED}; |
macgyveremir | 0:1e4a74c2c16f | 283 | IpAddr ip; |
macgyveremir | 0:1e4a74c2c16f | 284 | TCPSocket *socket; |
macgyveremir | 0:1e4a74c2c16f | 285 | bool readable; |
macgyveremir | 0:1e4a74c2c16f | 286 | bool writable; |
macgyveremir | 0:1e4a74c2c16f | 287 | bool preread; |
macgyveremir | 0:1e4a74c2c16f | 288 | char preread_byte; |
macgyveremir | 0:1e4a74c2c16f | 289 | ConnectionState state; |
macgyveremir | 0:1e4a74c2c16f | 290 | bool disconnected; |
macgyveremir | 0:1e4a74c2c16f | 291 | bool debug; |
macgyveremir | 0:1e4a74c2c16f | 292 | |
macgyveremir | 0:1e4a74c2c16f | 293 | ClientSocket(IpAddr ip, TCPSocket *socket, bool debug = false); |
macgyveremir | 0:1e4a74c2c16f | 294 | void createClientSocket(IpAddr ip, int port, float timeout); |
macgyveremir | 0:1e4a74c2c16f | 295 | void onTCPSocketEvent(TCPSocketEvent e); |
macgyveremir | 0:1e4a74c2c16f | 296 | }; |
macgyveremir | 0:1e4a74c2c16f | 297 | |
macgyveremir | 0:1e4a74c2c16f | 298 | /** |
macgyveremir | 0:1e4a74c2c16f | 299 | * server socket class for handling incoming communication requests |
macgyveremir | 0:1e4a74c2c16f | 300 | */ |
macgyveremir | 0:1e4a74c2c16f | 301 | class ServerSocket { |
macgyveremir | 0:1e4a74c2c16f | 302 | public: |
macgyveremir | 0:1e4a74c2c16f | 303 | /** |
macgyveremir | 0:1e4a74c2c16f | 304 | * creates a ServerSocket object. |
macgyveremir | 0:1e4a74c2c16f | 305 | * |
macgyveremir | 0:1e4a74c2c16f | 306 | * @param port port for server socket |
macgyveremir | 0:1e4a74c2c16f | 307 | * @param debug set true to run in debug mode |
macgyveremir | 0:1e4a74c2c16f | 308 | */ |
macgyveremir | 0:1e4a74c2c16f | 309 | ServerSocket(int port, bool debug = false); |
macgyveremir | 0:1e4a74c2c16f | 310 | |
macgyveremir | 0:1e4a74c2c16f | 311 | /** |
macgyveremir | 0:1e4a74c2c16f | 312 | * waits for a client to connect. |
macgyveremir | 0:1e4a74c2c16f | 313 | * |
macgyveremir | 0:1e4a74c2c16f | 314 | * @param timeout max time (in msec) for waiting for clients to connect |
macgyveremir | 0:1e4a74c2c16f | 315 | * |
macgyveremir | 0:1e4a74c2c16f | 316 | * @returns a socket to talk with the connecting client or a disconnected socket if timed out |
macgyveremir | 0:1e4a74c2c16f | 317 | */ |
macgyveremir | 0:1e4a74c2c16f | 318 | ClientSocket accept(float timeout = 5.0); |
macgyveremir | 0:1e4a74c2c16f | 319 | |
macgyveremir | 0:1e4a74c2c16f | 320 | /** |
macgyveremir | 0:1e4a74c2c16f | 321 | * sets debug mode. |
macgyveremir | 0:1e4a74c2c16f | 322 | * |
macgyveremir | 0:1e4a74c2c16f | 323 | * @param debug true to run in debug mode, false to normal mode |
macgyveremir | 0:1e4a74c2c16f | 324 | */ |
macgyveremir | 0:1e4a74c2c16f | 325 | void setDebug(bool debug); |
macgyveremir | 0:1e4a74c2c16f | 326 | |
macgyveremir | 0:1e4a74c2c16f | 327 | private: |
macgyveremir | 0:1e4a74c2c16f | 328 | TCPSocket ssocket; |
macgyveremir | 0:1e4a74c2c16f | 329 | bool accepted; |
macgyveremir | 0:1e4a74c2c16f | 330 | Timer timer; |
macgyveremir | 0:1e4a74c2c16f | 331 | bool debug; |
macgyveremir | 0:1e4a74c2c16f | 332 | |
macgyveremir | 0:1e4a74c2c16f | 333 | void onTCPSocketEvent(TCPSocketEvent e); |
macgyveremir | 0:1e4a74c2c16f | 334 | }; |
macgyveremir | 0:1e4a74c2c16f | 335 | |
macgyveremir | 0:1e4a74c2c16f | 336 | /** |
macgyveremir | 0:1e4a74c2c16f | 337 | * datagram socket class for UDP |
macgyveremir | 0:1e4a74c2c16f | 338 | */ |
macgyveremir | 0:1e4a74c2c16f | 339 | class DatagramSocket { |
macgyveremir | 0:1e4a74c2c16f | 340 | public: |
macgyveremir | 0:1e4a74c2c16f | 341 | /** |
macgyveremir | 0:1e4a74c2c16f | 342 | * creates a DatagramSocket object with the specified port number. |
macgyveremir | 0:1e4a74c2c16f | 343 | * |
macgyveremir | 0:1e4a74c2c16f | 344 | * @param port port for datagram socket |
macgyveremir | 0:1e4a74c2c16f | 345 | * @param debug set true to run in debug mode |
macgyveremir | 0:1e4a74c2c16f | 346 | */ |
macgyveremir | 0:1e4a74c2c16f | 347 | DatagramSocket(int port = 0, bool debug = false); |
macgyveremir | 0:1e4a74c2c16f | 348 | |
macgyveremir | 0:1e4a74c2c16f | 349 | /** |
macgyveremir | 0:1e4a74c2c16f | 350 | * creates a DatagramSocket object with the specified host. |
macgyveremir | 0:1e4a74c2c16f | 351 | * |
macgyveremir | 0:1e4a74c2c16f | 352 | * @param host host for datagram socket |
macgyveremir | 0:1e4a74c2c16f | 353 | * @param debug set true to run in debug mode |
macgyveremir | 0:1e4a74c2c16f | 354 | */ |
macgyveremir | 0:1e4a74c2c16f | 355 | DatagramSocket(Host host, bool debug = false); |
macgyveremir | 0:1e4a74c2c16f | 356 | |
macgyveremir | 0:1e4a74c2c16f | 357 | /** |
macgyveremir | 0:1e4a74c2c16f | 358 | * creates a DatagramSocket object with the specified ip address and port number. |
macgyveremir | 0:1e4a74c2c16f | 359 | * |
macgyveremir | 0:1e4a74c2c16f | 360 | * @param ip address for datagram socket |
macgyveremir | 0:1e4a74c2c16f | 361 | * @param port port for datagram socket |
macgyveremir | 0:1e4a74c2c16f | 362 | * @param debug set true to run in debug mode |
macgyveremir | 0:1e4a74c2c16f | 363 | */ |
macgyveremir | 0:1e4a74c2c16f | 364 | DatagramSocket(IpAddr ip, int port, bool debug = false); |
macgyveremir | 0:1e4a74c2c16f | 365 | |
macgyveremir | 0:1e4a74c2c16f | 366 | /** |
macgyveremir | 0:1e4a74c2c16f | 367 | * destructor for DatagramSocket. |
macgyveremir | 0:1e4a74c2c16f | 368 | */ |
macgyveremir | 0:1e4a74c2c16f | 369 | ~DatagramSocket(); |
macgyveremir | 0:1e4a74c2c16f | 370 | |
macgyveremir | 0:1e4a74c2c16f | 371 | /** |
macgyveremir | 0:1e4a74c2c16f | 372 | * writes data to the socket |
macgyveremir | 0:1e4a74c2c16f | 373 | * |
macgyveremir | 0:1e4a74c2c16f | 374 | * @param buf buffer for data to be written |
macgyveremir | 0:1e4a74c2c16f | 375 | * @param length data length contained in the buffer |
macgyveremir | 0:1e4a74c2c16f | 376 | * |
macgyveremir | 0:1e4a74c2c16f | 377 | * @returns number of chars written |
macgyveremir | 0:1e4a74c2c16f | 378 | */ |
macgyveremir | 0:1e4a74c2c16f | 379 | int write(char *buf, int length); |
macgyveremir | 0:1e4a74c2c16f | 380 | |
macgyveremir | 0:1e4a74c2c16f | 381 | /** |
macgyveremir | 0:1e4a74c2c16f | 382 | * prints data to the socket according to the specified format string. |
macgyveremir | 0:1e4a74c2c16f | 383 | * |
macgyveremir | 0:1e4a74c2c16f | 384 | * @param format printf format string, corresponding arguments follow |
macgyveremir | 0:1e4a74c2c16f | 385 | * |
macgyveremir | 0:1e4a74c2c16f | 386 | * @returns number of chars written |
macgyveremir | 0:1e4a74c2c16f | 387 | */ |
macgyveremir | 0:1e4a74c2c16f | 388 | int printf(const char* format, ...); |
macgyveremir | 0:1e4a74c2c16f | 389 | |
macgyveremir | 0:1e4a74c2c16f | 390 | /** |
macgyveremir | 0:1e4a74c2c16f | 391 | * sends data packet to the specified host. |
macgyveremir | 0:1e4a74c2c16f | 392 | * |
macgyveremir | 0:1e4a74c2c16f | 393 | * @param host destination of this packet to be sent |
macgyveremir | 0:1e4a74c2c16f | 394 | */ |
macgyveremir | 0:1e4a74c2c16f | 395 | void send(Host& host); |
macgyveremir | 0:1e4a74c2c16f | 396 | |
macgyveremir | 0:1e4a74c2c16f | 397 | /** |
macgyveremir | 0:1e4a74c2c16f | 398 | * sends data packet to the specified IP address and port. |
macgyveremir | 0:1e4a74c2c16f | 399 | * |
macgyveremir | 0:1e4a74c2c16f | 400 | * @param ip destination IP address of the data packet |
macgyveremir | 0:1e4a74c2c16f | 401 | * @param port destination port number of the data packet |
macgyveremir | 0:1e4a74c2c16f | 402 | */ |
macgyveremir | 0:1e4a74c2c16f | 403 | void send(IpAddr ip, int port); |
macgyveremir | 0:1e4a74c2c16f | 404 | |
macgyveremir | 0:1e4a74c2c16f | 405 | /** |
macgyveremir | 0:1e4a74c2c16f | 406 | * sends data packet to the destination of specified name and port. |
macgyveremir | 0:1e4a74c2c16f | 407 | * |
macgyveremir | 0:1e4a74c2c16f | 408 | * @param name destination host name of the data packet |
macgyveremir | 0:1e4a74c2c16f | 409 | * @param port destination port number of the data packet |
macgyveremir | 0:1e4a74c2c16f | 410 | */ |
macgyveremir | 0:1e4a74c2c16f | 411 | void send(char *name, int port); |
macgyveremir | 0:1e4a74c2c16f | 412 | |
macgyveremir | 0:1e4a74c2c16f | 413 | /** |
macgyveremir | 0:1e4a74c2c16f | 414 | * reads data packet from the datagram socket. |
macgyveremir | 0:1e4a74c2c16f | 415 | * |
macgyveremir | 0:1e4a74c2c16f | 416 | * @param buf buffer to store data |
macgyveremir | 0:1e4a74c2c16f | 417 | * @param size size of the buf |
macgyveremir | 0:1e4a74c2c16f | 418 | * |
macgyveremir | 0:1e4a74c2c16f | 419 | * @returns number of bytes actually stored |
macgyveremir | 0:1e4a74c2c16f | 420 | */ |
macgyveremir | 0:1e4a74c2c16f | 421 | int read(char *buf, int size); |
macgyveremir | 0:1e4a74c2c16f | 422 | |
macgyveremir | 0:1e4a74c2c16f | 423 | /** |
macgyveremir | 0:1e4a74c2c16f | 424 | * scans data according to the specified format string. |
macgyveremir | 0:1e4a74c2c16f | 425 | * |
macgyveremir | 0:1e4a74c2c16f | 426 | * @param format scanf format string, corresponding arguments follow |
macgyveremir | 0:1e4a74c2c16f | 427 | * |
macgyveremir | 0:1e4a74c2c16f | 428 | * @returns number of input items assigned |
macgyveremir | 0:1e4a74c2c16f | 429 | */ |
macgyveremir | 0:1e4a74c2c16f | 430 | int scanf(const char* format, ...); |
macgyveremir | 0:1e4a74c2c16f | 431 | |
macgyveremir | 0:1e4a74c2c16f | 432 | /** |
macgyveremir | 0:1e4a74c2c16f | 433 | * receives data packet. |
macgyveremir | 0:1e4a74c2c16f | 434 | * |
macgyveremir | 0:1e4a74c2c16f | 435 | * @param host pointer to the Host object to store the host info, if specified |
macgyveremir | 0:1e4a74c2c16f | 436 | * @param timeout maximum waiting time before data packet comes in |
macgyveremir | 0:1e4a74c2c16f | 437 | * |
macgyveremir | 0:1e4a74c2c16f | 438 | * @returns number of bytes received |
macgyveremir | 0:1e4a74c2c16f | 439 | */ |
macgyveremir | 0:1e4a74c2c16f | 440 | int receive(Host *host = 0, float timeout = 5.0); |
macgyveremir | 0:1e4a74c2c16f | 441 | |
macgyveremir | 0:1e4a74c2c16f | 442 | /** |
macgyveremir | 0:1e4a74c2c16f | 443 | * sets debug mode. |
macgyveremir | 0:1e4a74c2c16f | 444 | * |
macgyveremir | 0:1e4a74c2c16f | 445 | * @param debug true to run in debug mode, false to normal mode |
macgyveremir | 0:1e4a74c2c16f | 446 | */ |
macgyveremir | 0:1e4a74c2c16f | 447 | void setDebug(bool debug); |
macgyveremir | 0:1e4a74c2c16f | 448 | |
macgyveremir | 0:1e4a74c2c16f | 449 | private: |
macgyveremir | 0:1e4a74c2c16f | 450 | Host host; |
macgyveremir | 0:1e4a74c2c16f | 451 | UDPSocket udpSocket; |
macgyveremir | 0:1e4a74c2c16f | 452 | Timer timer; |
macgyveremir | 0:1e4a74c2c16f | 453 | bool readable; |
macgyveremir | 0:1e4a74c2c16f | 454 | int length; |
macgyveremir | 0:1e4a74c2c16f | 455 | int bufsize; |
macgyveremir | 0:1e4a74c2c16f | 456 | char *buf; |
macgyveremir | 0:1e4a74c2c16f | 457 | bool debug; |
macgyveremir | 0:1e4a74c2c16f | 458 | |
macgyveremir | 0:1e4a74c2c16f | 459 | void createDatagramSocket(); |
macgyveremir | 0:1e4a74c2c16f | 460 | void onUDPSocketEvent(UDPSocketEvent e); |
macgyveremir | 0:1e4a74c2c16f | 461 | }; |
macgyveremir | 0:1e4a74c2c16f | 462 | |
macgyveremir | 0:1e4a74c2c16f | 463 | /** |
macgyveremir | 0:1e4a74c2c16f | 464 | * a simple DNS resolver |
macgyveremir | 0:1e4a74c2c16f | 465 | */ |
macgyveremir | 0:1e4a74c2c16f | 466 | class Resolver { |
macgyveremir | 0:1e4a74c2c16f | 467 | public: |
macgyveremir | 0:1e4a74c2c16f | 468 | /** |
macgyveremir | 0:1e4a74c2c16f | 469 | * creates a Resolver object |
macgyveremir | 0:1e4a74c2c16f | 470 | */ |
macgyveremir | 0:1e4a74c2c16f | 471 | Resolver(); |
macgyveremir | 0:1e4a74c2c16f | 472 | |
macgyveremir | 0:1e4a74c2c16f | 473 | /** |
macgyveremir | 0:1e4a74c2c16f | 474 | * resolves the specified domain/host name and returns its IP address. |
macgyveremir | 0:1e4a74c2c16f | 475 | * |
macgyveremir | 0:1e4a74c2c16f | 476 | * @param name domain/host name to be resolved or IP address in "nnn.nnn.nnn.nnn" format |
macgyveremir | 0:1e4a74c2c16f | 477 | * @param debug true to display debugging information |
macgyveremir | 0:1e4a74c2c16f | 478 | * |
macgyveremir | 0:1e4a74c2c16f | 479 | * @returns resolved IP address object |
macgyveremir | 0:1e4a74c2c16f | 480 | */ |
macgyveremir | 0:1e4a74c2c16f | 481 | IpAddr resolve(char *name, bool debug = false); |
macgyveremir | 0:1e4a74c2c16f | 482 | |
macgyveremir | 0:1e4a74c2c16f | 483 | private: |
macgyveremir | 0:1e4a74c2c16f | 484 | bool replied; |
macgyveremir | 0:1e4a74c2c16f | 485 | DNSReply reply; |
macgyveremir | 0:1e4a74c2c16f | 486 | |
macgyveremir | 0:1e4a74c2c16f | 487 | void onReply(DNSReply reply); |
macgyveremir | 0:1e4a74c2c16f | 488 | }; |
macgyveremir | 0:1e4a74c2c16f | 489 | |
macgyveremir | 0:1e4a74c2c16f | 490 | #endif |