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