NetworkSocketAPI
Dependents: HelloWizFi250Interface
Fork of NetworkSocketAPI by
Revision 27:d7ed39727306, committed 2016-02-18
- Comitter:
- Christopher Haster
- Date:
- Thu Feb 18 09:20:39 2016 -0600
- Branch:
- api-changes
- Parent:
- 26:9774a2edad71
- Child:
- 28:163fbe3263f4
- Commit message:
- Added better behaviour for urls in constructors
Changed in this revision
--- a/Socket.cpp Thu Feb 18 06:16:11 2016 -0600 +++ b/Socket.cpp Thu Feb 18 09:20:39 2016 -0600 @@ -15,6 +15,8 @@ */ #include "Socket.h" +#include <cstdlib> +#include <cstring> Socket::Socket( NetworkInterface *iface, @@ -23,36 +25,74 @@ uint16_t port) : _iface(iface) , _proto(proto) - , _socket(0) { - if (url) setURL(url); - if (port) setPort(port); + , _socket(0) + , _pending_url(0) + , _pending_ip(0) + , _pending_port(0) { + + if (url) { + _pending_url = (char*)malloc(strlen(url)+1); + strcpy(_pending_url, url); + } + + if (port) { + _pending_port = port; + } } Socket::~Socket() { if (_socket) _iface->destroySocket(_socket); + free(_pending_url); + free(_pending_ip); } SocketInterface *Socket::_get_socket() { - if (!_socket) _socket = _iface->createSocket(_proto); + if (!_socket) { + _socket = _iface->createSocket(_proto); + + if (_pending_url) { + _socket->setURL(_pending_url); + free(_pending_url); + _pending_url = 0; + } + + if (_pending_ip) { + _socket->setIPAddress(_pending_ip); + free(_pending_ip); + _pending_ip = 0; + } + + if (_pending_port) { + _socket->setPort(_pending_port); + _pending_port = 0; + } + } + return _socket; } -void Socket::setURL(const char *url) { +int32_t Socket::setURL(const char *url) { SocketInterface *s = _get_socket(); - if (!s) return; - s->setURL(url); + if (!s) return -2; + return s->setURL(url); } void Socket::setIPAddress(const char *ip) { - SocketInterface *s = _get_socket(); - if (!s) return; - s->setIPAddress(ip); + if (!_socket) { + free(_pending_ip); + _pending_ip = (char*)malloc(strlen(ip)+1); + strcpy(_pending_ip, ip); + } else { + _socket->setIPAddress(ip); + } } void Socket::setPort(uint16_t port) { - SocketInterface *s = _get_socket(); - if (!s) return; - s->setPort(port); + if (!_socket) { + _pending_port = port; + } else { + _socket->setPort(port); + } } const char *Socket::getIPAddress() {
--- a/Socket.h Thu Feb 18 06:16:11 2016 -0600 +++ b/Socket.h Thu Feb 18 09:20:39 2016 -0600 @@ -29,8 +29,9 @@ /** Set the URL of the socket * Performs DNS lookup if necessary * @param url URL to connect to + * @return 0 on success */ - void setURL(const char *url); + int32_t setURL(const char *url); /** Set the IP address of the socket * @param ip IP address to connect to, copied internally @@ -83,6 +84,10 @@ NetworkInterface *_iface; socket_protocol_t _proto; SocketInterface *_socket; + + char *_pending_url; + char *_pending_ip; + uint16_t _pending_port; }; #endif
--- a/SocketInterface.h Thu Feb 18 06:16:11 2016 -0600 +++ b/SocketInterface.h Thu Feb 18 09:20:39 2016 -0600 @@ -39,8 +39,9 @@ /** Set the URL of the socket * Performs DNS lookup if necessary * @param url URL to connect to + * @return 0 on success */ - virtual void setURL(const char *url) = 0; + virtual int32_t setURL(const char *url) = 0; /** Set the IP address of the socket * @param ip IP address to connect to, copied internally
--- a/TCPSocket.h Thu Feb 18 06:16:11 2016 -0600 +++ b/TCPSocket.h Thu Feb 18 09:20:39 2016 -0600 @@ -27,8 +27,9 @@ { public: /** Create a socket using the specified network interface + * No network operations are performed until the socket is actually used * @param iface The network interface to use - * @param ip Optional URL to connect to, copied internally + * @param url Optional URL to connect to, copied internally * @param port Optional port to connect to */ TCPSocket(NetworkInterface *iface, const char *url = 0, uint16_t port = 0);
--- a/UDPSocket.h Thu Feb 18 06:16:11 2016 -0600 +++ b/UDPSocket.h Thu Feb 18 09:20:39 2016 -0600 @@ -27,6 +27,7 @@ { public: /** Create a socket using the specified network interface + * No network operations are performed until the socket is actually used * @param iface The network interface to use * @param ip Optional URL to connect to, copied internally * @param port Optional port to connect to