73 lines
2 KiB
C++
73 lines
2 KiB
C++
|
// Simple UDP listening server
|
||
|
//
|
||
|
// Author: Brian Lee
|
||
|
//
|
||
|
// Copyright: GPL V2
|
||
|
// See http://www.gnu.org/licenses/gpl.html
|
||
|
|
||
|
#include "EtherCard.h"
|
||
|
#include "net.h"
|
||
|
|
||
|
#define gPB ether.buffer
|
||
|
|
||
|
#define UDPSERVER_MAXLISTENERS 8 //the maximum number of port listeners.
|
||
|
|
||
|
typedef struct {
|
||
|
UdpServerCallback callback;
|
||
|
uint16_t port;
|
||
|
bool listening;
|
||
|
} UdpServerListener;
|
||
|
|
||
|
UdpServerListener listeners[UDPSERVER_MAXLISTENERS];
|
||
|
byte numListeners = 0;
|
||
|
|
||
|
void EtherCard::udpServerListenOnPort(UdpServerCallback callback, uint16_t port) {
|
||
|
if(numListeners < UDPSERVER_MAXLISTENERS)
|
||
|
{
|
||
|
listeners[numListeners] = (UdpServerListener) {
|
||
|
callback, port, true
|
||
|
};
|
||
|
numListeners++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void EtherCard::udpServerPauseListenOnPort(uint16_t port) {
|
||
|
for(int i = 0; i < numListeners; i++)
|
||
|
{
|
||
|
if(gPB[UDP_DST_PORT_H_P] == (listeners[i].port >> 8) && gPB[UDP_DST_PORT_L_P] == ((byte) listeners[i].port)) {
|
||
|
listeners[i].listening = false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void EtherCard::udpServerResumeListenOnPort(uint16_t port) {
|
||
|
for(int i = 0; i < numListeners; i++)
|
||
|
{
|
||
|
if(gPB[UDP_DST_PORT_H_P] == (listeners[i].port >> 8) && gPB[UDP_DST_PORT_L_P] == ((byte) listeners[i].port)) {
|
||
|
listeners[i].listening = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool EtherCard::udpServerListening() {
|
||
|
return numListeners > 0;
|
||
|
}
|
||
|
|
||
|
bool EtherCard::udpServerHasProcessedPacket(uint16_t plen) {
|
||
|
bool packetProcessed = false;
|
||
|
for(int i = 0; i < numListeners; i++)
|
||
|
{
|
||
|
if(gPB[UDP_DST_PORT_H_P] == (listeners[i].port >> 8) && gPB[UDP_DST_PORT_L_P] == ((byte) listeners[i].port) && listeners[i].listening)
|
||
|
{
|
||
|
uint16_t datalen = (uint16_t) (gPB[UDP_LEN_H_P] << 8) + gPB[UDP_LEN_L_P] - UDP_HEADER_LEN;
|
||
|
listeners[i].callback(
|
||
|
listeners[i].port,
|
||
|
gPB + IP_SRC_P,
|
||
|
(const char *) (gPB + UDP_DATA_P),
|
||
|
datalen);
|
||
|
packetProcessed = true;
|
||
|
}
|
||
|
}
|
||
|
return packetProcessed;
|
||
|
}
|