11 #include <sys/socket.h> 12 #include <netinet/in.h> 13 #include <linux/if_ether.h> 14 #include <netinet/ip.h> 15 #include <netinet/udp.h> 16 #include <arpa/inet.h> 17 #include <linux/filter.h> 18 #include "LibCyberRadio/NDR651/TransmitSocket.h" 19 #include <netpacket/packet.h> 20 #include <net/ethernet.h> 22 #include <sys/types.h> 23 #include <sys/ioctl.h> 54 bool TransmitSocket::_makeRawSocket() {
58 struct sockaddr_ll addr;
61 _sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP));
69 setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR,
70 (
const void *)&optval ,
sizeof(
int));
73 memset(&addr,0,
sizeof(addr));
74 addr.sll_family=AF_PACKET;
75 addr.sll_protocol=htons(ETH_P_IP);
76 addr.sll_ifindex=if_nametoindex(_ifname.c_str());
79 if (bind(_sockfd,(
struct sockaddr*)&addr,
sizeof(addr))) {
88 bool TransmitSocket::_makeUdpSocket() {
91 struct sockaddr_in serveraddr;
93 char str[INET_ADDRSTRLEN];
95 _sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
98 ifr.ifr_addr.sa_family = AF_INET;
99 strncpy(ifr.ifr_name,
"eth0", IFNAMSIZ-1);
100 ioctl(_sockfd, SIOCGIFADDR, &ifr);
111 memset((
char *) &serveraddr, 0,
sizeof(serveraddr));
112 serveraddr.sin_family = AF_INET;
113 serveraddr.sin_port = htons((
unsigned short)_sport);
114 serveraddr.sin_addr = ((
struct sockaddr_in *)&ifr.ifr_addr)->sin_addr;
128 if (_isBroadcast||
true) {
129 rv = setsockopt(_sockfd, SOL_SOCKET, SO_BROADCAST, (
const void *)&optval,
sizeof(
int) );
132 struct ifaddrs *ifap, *ifa;
133 struct sockaddr_in *sa;
135 std::string retString;
137 for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
138 if ( strcmp(ifa->ifa_name,_ifname.c_str())==0 ){
139 if (ifa->ifa_addr->sa_family==AF_INET) {
140 sa = (
struct sockaddr_in *) ifa->ifa_ifu.ifu_broadaddr;
141 sa->sin_port = htons(_sport);
142 addr = inet_ntoa(sa->sin_addr);
143 rv = connect(_sockfd, (
struct sockaddr *)sa,
sizeof(sockaddr_in));
152 std::cerr <<
"I NEED A DESTINATION ADDRESS" << std::endl;
159 bool TransmitSocket::_makeSocket() {
162 return _makeRawSocket();
164 return _makeUdpSocket();
172 memset(&ifr, 0x00,
sizeof(ifr));
173 strcpy(ifr.ifr_name, _ifname.c_str());
174 ioctl(_sockfd, SIOCGIFHWADDR, &ifr);
175 sprintf(macstring,
"%02x:%02x:%02x:%02x:%02x:%02x",
176 (
unsigned char)ifr.ifr_hwaddr.sa_data[0],
177 (
unsigned char)ifr.ifr_hwaddr.sa_data[1],
178 (
unsigned char)ifr.ifr_hwaddr.sa_data[2],
179 (
unsigned char)ifr.ifr_hwaddr.sa_data[3],
180 (
unsigned char)ifr.ifr_hwaddr.sa_data[4],
181 (
unsigned char)ifr.ifr_hwaddr.sa_data[5]);
182 return std::string(macstring);
188 ifr.ifr_addr.sa_family = AF_INET;
190 strncpy(ifr.ifr_name, _ifname.c_str(), IFNAMSIZ-1);
191 ioctl(_sockfd, SIOCGIFADDR, &ifr);
193 return std::string(inet_ntoa(((
struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
197 struct ifaddrs *ifap, *ifa;
198 struct sockaddr_in *sa;
201 for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
202 if ( strcmp(ifa->ifa_name,_ifname.c_str())==0 ){
203 if (ifa->ifa_addr->sa_family==AF_INET) {
204 sa = (
struct sockaddr_in *) ifa->ifa_ifu.ifu_broadaddr;
205 addr = inet_ntoa(sa->sin_addr);
211 return std::string(addr);
216 _txBytes = send(_sockfd, frame, frameLen, 0);
219 _byteCount += _txBytes;
bool sendFrame(unsigned char *frame, const int &frameLen)
Sends a frame of data.
std::string getIpBroadcastAddress()
Gets the IP broadcast address.
Defines functionality for LibCyberRadio applications.
std::string getMacAddress()
Gets the MAC address.
TransmitSocket(const std::string &ifname, unsigned int sport)
Constructs a TransmitSocket object.
std::string getIpAddress()
Gets the IP address.
virtual ~TransmitSocket()
Destroys a TransmitSocket object.