VZTECH / Socket_vz

Dependents:   EthernetInterface_vz

Fork of Socket by VZTECH

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers UDPSocket.cpp Source File

UDPSocket.cpp

00001 /* Copyright (C) 2012 mbed.org, MIT License
00002  *
00003  * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
00004  * and associated documentation files (the "Software"), to deal in the Software without restriction,
00005  * including without limitation the rights to use, copy, modify, merge, publish, distribute,
00006  * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
00007  * furnished to do so, subject to the following conditions:
00008  *
00009  * The above copyright notice and this permission notice shall be included in all copies or
00010  * substantial portions of the Software.
00011  *
00012  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
00013  * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00014  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
00015  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00016  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00017  */
00018 
00019 #include "Socket/UDPSocket.h"
00020 
00021 #include <cstring>
00022 
00023 using std::memset;
00024 
00025 int lwip_sock_portando_ntohs = 0;
00026 int lwip_sock_portando_local_port = 0;
00027 
00028 //#include "header_app_includes.h"
00029 #include "debug.h"
00030 
00031 UDPSocket::UDPSocket() {
00032 }
00033 
00034 int UDPSocket::init(void) {
00035     return init_socket(SOCK_DGRAM);
00036 }
00037 
00038 // Server initialization
00039 int UDPSocket::bind(int port) {
00040     if (init_socket(SOCK_DGRAM) < 0)
00041         return -1;
00042     
00043     struct sockaddr_in localHost;
00044     std::memset(&localHost, 0, sizeof(localHost));
00045     
00046     localHost.sin_family = AF_INET;
00047     localHost.sin_port = htons(port);
00048     
00049     if ( debug_bind ) vz_printf ("bind of %d -- result in ( %d, %d )", port, htons(port), localHost.sin_port );
00050     
00051     localHost.sin_addr.s_addr = INADDR_ANY;
00052     
00053     if (lwip_bind(_sock_fd, (const struct sockaddr *) &localHost, sizeof(localHost)) < 0) {
00054         close();
00055         return -1;
00056     }
00057     if ( debug_bind ) vz_printf ("lwip_sock_portando_local_port %d - lwip_sock_portando_ntohs %d ", lwip_sock_portando_local_port, lwip_sock_portando_ntohs );
00058     
00059     return 0;
00060 }
00061 
00062 int UDPSocket::join_multicast_group(const char* address) {
00063     struct ip_mreq mreq;
00064     
00065     // Set up group address 
00066     mreq.imr_multiaddr.s_addr = inet_addr(address);
00067     mreq.imr_interface.s_addr = htonl(INADDR_ANY);
00068     
00069     return set_option(IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
00070 }
00071 
00072 int UDPSocket::set_broadcasting(bool broadcast) {
00073     int option = (broadcast) ? (1) : (0);
00074     return set_option(SOL_SOCKET, SO_BROADCAST, &option, sizeof(option));
00075 }
00076 
00077 // -1 if unsuccessful, else number of bytes written
00078 int UDPSocket::sendTo(Endpoint &remote, char *packet, int length) {
00079     if (_sock_fd < 0)
00080         return -1;
00081     
00082     if (!_blocking) {
00083         TimeInterval timeout(_timeout);
00084         if (wait_writable(timeout) != 0)
00085             return 0;
00086     }
00087     
00088     return lwip_sendto(_sock_fd, packet, length, 0, (const struct sockaddr *) &remote._remoteHost, sizeof(remote._remoteHost));
00089 }
00090 
00091 // -1 if unsuccessful, else number of bytes received
00092 int UDPSocket::receiveFrom(Endpoint &remote, char *buffer, int length) {
00093     if (_sock_fd < 0)
00094         return -1;
00095     
00096     if (!_blocking) {
00097         TimeInterval timeout(_timeout);
00098         if (wait_readable(timeout) != 0)
00099             return 0;
00100     }
00101     remote.reset_address();
00102     socklen_t remoteHostLen = sizeof(remote._remoteHost);
00103     return lwip_recvfrom(_sock_fd, buffer, length, 0, (struct sockaddr*) &remote._remoteHost, &remoteHostLen);
00104 }
00105 
00106 int UDPSocket::get_fd(){
00107     return _sock_fd;
00108 }