Go to the documentation of this file.00001
00002
00003
00004
00005
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
00019 #include "ibrcommon/net/ieee802154.h"
00020
00021 namespace ibrcommon
00022 {
00023 lowpansocket::lowpansocket(u_char proto) throw (SocketException)
00024 {
00025
00026 if ((_socket = ::socket(PF_IEEE802154, SOCK_DGRAM, 0)) < 0)
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
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
00075
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 }