Host library for controlling a WiConnect enabled Wi-Fi module.
Dependents: wiconnect-ota_example wiconnect-web_setup_example wiconnect-test-console wiconnect-tcp_server_example ... more
UDPSocket.cpp
00001 /** 00002 * ACKme WiConnect Host Library is licensed under the BSD licence: 00003 * 00004 * Copyright (c)2014 ACKme Networks. 00005 * All rights reserved. 00006 * 00007 * Redistribution and use in source and binary forms, with or without modification, 00008 * are permitted provided that the following conditions are met: 00009 * 00010 * 1. Redistributions of source code must retain the above copyright notice, 00011 * this list of conditions and the following disclaimer. 00012 * 2. Redistributions in binary form must reproduce the above copyright notice, 00013 * this list of conditions and the following disclaimer in the documentation 00014 * and/or other materials provided with the distribution. 00015 * 3. The name of the author may not be used to endorse or promote products 00016 * derived from this software without specific prior written permission. 00017 * 00018 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS AND ANY EXPRESS OR IMPLIED 00019 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 00020 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 00021 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00022 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 00023 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00024 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00025 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 00026 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 00027 * OF SUCH DAMAGE. 00028 */ 00029 00030 #include "Wiconnect.h" 00031 #include "api/types/Socket/UDPSocket.h" 00032 00033 00034 00035 /*************************************************************************************************/ 00036 UDPSocket::UDPSocket(int rxBufferLen, void *rxBuffer, int txBufferLen, void *txBuffer) 00037 : Socket(rxBufferLen, rxBuffer, txBufferLen, txBuffer), localPort(SOCKET_ANY_PORT) 00038 { 00039 } 00040 00041 /*************************************************************************************************/ 00042 int UDPSocket::init(void) 00043 { 00044 return 0; 00045 } 00046 00047 /*************************************************************************************************/ 00048 // Server initialization 00049 int UDPSocket::bind(int port) 00050 { 00051 localPort = port; 00052 return 0; 00053 } 00054 00055 /*************************************************************************************************/ 00056 int UDPSocket::join_multicast_group(const char* address) 00057 { 00058 return -1; 00059 } 00060 00061 /*************************************************************************************************/ 00062 int UDPSocket::set_broadcasting(bool broadcast) 00063 { 00064 return 0; 00065 } 00066 00067 /*************************************************************************************************/ 00068 // -1 if unsuccessful, else number of bytes written 00069 int UDPSocket::sendTo(Endpoint &remote, char *packet, int length) 00070 { 00071 if(!socket.isConnected()) 00072 { 00073 if(Wiconnect::getInstance()->udpConnect(socket, remote.get_address(), remote.get_port(), localPort) != WICONNECT_SUCCESS) 00074 { 00075 return -1; 00076 } 00077 } 00078 return (socket.write(packet, length, true) == WICONNECT_SUCCESS) ? length : -1; 00079 } 00080 00081 /*************************************************************************************************/ 00082 // -1 if unsuccessful, else number of bytes received 00083 int UDPSocket::receiveFrom(Endpoint &remote, char *buffer, int length) 00084 { 00085 uint16_t bytesRead; 00086 00087 if(!socket.isConnected()) 00088 { 00089 if(Wiconnect::getInstance()->udpConnect(socket, remote._ipAddress, remote.get_port(), localPort) != WICONNECT_SUCCESS) 00090 { 00091 return -1; 00092 } 00093 } 00094 00095 if (!_blocking) 00096 { 00097 if(socket.getRxBufferSize() == 0 || socket.getRxBufferBytesPending() == 0) 00098 { 00099 TimeoutTimer timer; 00100 00101 for(;;) 00102 { 00103 bool hasData; 00104 00105 if(socket.poll(&hasData) != WICONNECT_SUCCESS) 00106 { 00107 return -1; 00108 } 00109 else if(hasData) 00110 { 00111 break; 00112 } 00113 else if(timer.timedOut(_timeout)) 00114 { 00115 return -1; 00116 } 00117 } 00118 } 00119 } 00120 00121 if(length == 1 && socket.getRxBufferSize() > 0) 00122 { 00123 return (socket.getc((uint8_t*)buffer) == WICONNECT_SUCCESS) ? 1 : -1; 00124 } 00125 else 00126 { 00127 for(;;) 00128 { 00129 if(socket.read(buffer, length, &bytesRead) != WICONNECT_SUCCESS) 00130 { 00131 return -1; 00132 } 00133 else if(bytesRead > 0) 00134 { 00135 return bytesRead; 00136 } 00137 } 00138 } 00139 00140 }
Generated on Tue Jul 12 2022 17:35:58 by 1.7.2