A Simple TCP & UDP Socket Library. An update from that of Hiroshi Yamaguchi.

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?

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