• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

ibrcommon/ibrcommon/net/lowpansocket.cpp

Go to the documentation of this file.
00001 /*
00002  * lowpansocket.cpp
00003  *
00004  *  Created on: 01.06.2010
00005  *      Author: stschmid
00006  */
00007 
00008 #include "ibrcommon/net/lowpansocket.h"
00009 #include <sys/socket.h>
00010 #include <errno.h>
00011 #include <sys/types.h>
00012 #include <netinet/in.h>
00013 #include <arpa/inet.h>
00014 #include <cassert>
00015 #include <string.h>
00016 #include <stdlib.h>
00017 
00018 /* Move to a better place */
00019 #include "ibrcommon/net/ieee802154.h"
00020 
00021 namespace ibrcommon
00022 {
00023         lowpansocket::lowpansocket(u_char proto) throw (SocketException)
00024         {
00025                 // Create socket for listening for client connection requests.
00026                 if ((_socket = ::socket(PF_IEEE802154, SOCK_DGRAM, 0)) < 0) // Ignoring proto for now
00027                 {
00028                         throw SocketException("lowpansocket: cannot create listen socket");
00029                 }
00030 
00031                 bzero(&_sockaddr, sizeof(_sockaddr));
00032                 _sockaddr.family = AF_IEEE802154;
00033                 _sockaddr.addr.addr_type = IEEE802154_ADDR_SHORT;
00034         }
00035 
00036         lowpansocket::~lowpansocket()
00037         {
00038                 if (_socket != 0)
00039                 {
00040                         shutdown();
00041                         ::close(_socket);
00042                 }
00043         }
00044 
00045         void lowpansocket::shutdown()
00046         {
00047                 //::shutdown(_socket, SHUT_RDWR);
00048                 ::close(_socket);
00049         }
00050 
00051         int lowpansocket::receive(char* data, size_t maxbuffer)
00052         {
00053                 struct sockaddr_ieee802154 clientAddress;
00054                 socklen_t clientAddressLength = sizeof(clientAddress);
00055 
00056                 int ret = recvfrom(_socket, data, maxbuffer, MSG_WAITALL, (struct sockaddr *) &clientAddress, &clientAddressLength);
00057                 return ret;
00058         }
00059 
00060         lowpansocket::peer::peer(lowpansocket &socket, const struct sockaddr_ieee802154 &dest, const unsigned int panid)
00061          : _socket(socket)
00062         {
00063                 bzero(&_destaddress, sizeof(_destaddress));
00064                 _destaddress.family = AF_IEEE802154;
00065                 _destaddress.addr.addr_type = IEEE802154_ADDR_SHORT;
00066 
00067                 memcpy(&_destaddress.addr.short_addr, &dest.addr.short_addr, sizeof(_destaddress.addr.short_addr));
00068                 _destaddress.addr.pan_id = panid;
00069         }
00070 
00071         int lowpansocket::peer::send(const char *data, const size_t length)
00072         {
00073                 ::connect(_socket._socket, (struct sockaddr *) &_destaddress, sizeof(_destaddress));
00074                 //printf("lowpan send() address %04x, PAN %04x\n", _destaddress.addr.short_addr, _destaddress.addr.pan_id);
00075                 //return ::sendto(_socket._socket, data, length, 0, (struct sockaddr *) &_destaddress, sizeof(_destaddress));
00076                 return ::send(_socket._socket, data, length, 0);
00077         }
00078 
00079         lowpansocket::peer lowpansocket::getPeer(const string address, const unsigned int panid)
00080         {
00081                 struct sockaddr_ieee802154 destaddress;
00082 
00083                 destaddress.addr.short_addr = atoi(address.c_str());
00084                 return lowpansocket::peer(*this, destaddress, panid);
00085         }
00086 }

Generated on Thu Nov 11 2010 09:49:47 for IBR-DTNSuite by  doxygen 1.7.1