A Simple TCP & UDP Socket Library

Dependents:   SimpleSocketExamples 1.0

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?

UserRevisionLine numberNew 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