Some quick code to use UDP-only (no TCP) with mBed. Echos received packets and sends packets when a button is pressed

Dependencies:   mbed

Committer:
pehrhovey
Date:
Sun Mar 14 00:54:12 2010 +0000
Revision:
0:a548a085de55

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pehrhovey 0:a548a085de55 1 #include "lwip/arch.h"
pehrhovey 0:a548a085de55 2
pehrhovey 0:a548a085de55 3 #include "dns.h"
pehrhovey 0:a548a085de55 4
pehrhovey 0:a548a085de55 5 #include "TCPConnection.h"
pehrhovey 0:a548a085de55 6 #include "TCPListener.h"
pehrhovey 0:a548a085de55 7 #include "NetServer.h"
pehrhovey 0:a548a085de55 8
pehrhovey 0:a548a085de55 9 using namespace std;
pehrhovey 0:a548a085de55 10 using namespace mbed;
pehrhovey 0:a548a085de55 11
pehrhovey 0:a548a085de55 12 void TCPConnection::dnsreply_callback(const char *name, struct ip_addr *ipaddr, void *arg) {
pehrhovey 0:a548a085de55 13 TCPConnection *connection = static_cast<TCPConnection *>(arg);
pehrhovey 0:a548a085de55 14 if(connection) {
pehrhovey 0:a548a085de55 15 (connection->dnsreply)(name, ipaddr);
pehrhovey 0:a548a085de55 16 }
pehrhovey 0:a548a085de55 17 }
pehrhovey 0:a548a085de55 18
pehrhovey 0:a548a085de55 19 err_t TCPConnection::connected_callback(void *arg, struct tcp_pcb *pcb, err_t err) {
pehrhovey 0:a548a085de55 20 TCPConnection *connection = static_cast<TCPConnection *>(arg);
pehrhovey 0:a548a085de55 21 LWIP_UNUSED_ARG(pcb);
pehrhovey 0:a548a085de55 22 if(connection) {
pehrhovey 0:a548a085de55 23 return (connection->connected)(err);
pehrhovey 0:a548a085de55 24 }
pehrhovey 0:a548a085de55 25 return ERR_OK;
pehrhovey 0:a548a085de55 26 }
pehrhovey 0:a548a085de55 27
pehrhovey 0:a548a085de55 28 err_t TCPConnection::sent_callback(void *arg, struct tcp_pcb *pcb, u16_t space) {
pehrhovey 0:a548a085de55 29 TCPConnection *connection = static_cast<TCPConnection *>(arg);
pehrhovey 0:a548a085de55 30 LWIP_UNUSED_ARG(pcb);
pehrhovey 0:a548a085de55 31 if(connection) {
pehrhovey 0:a548a085de55 32 return (connection->sent)(space);
pehrhovey 0:a548a085de55 33 }
pehrhovey 0:a548a085de55 34 return ERR_OK;
pehrhovey 0:a548a085de55 35 }
pehrhovey 0:a548a085de55 36
pehrhovey 0:a548a085de55 37 err_t TCPConnection::recv_callback(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) {
pehrhovey 0:a548a085de55 38 TCPConnection *connection = static_cast<TCPConnection *>(arg);
pehrhovey 0:a548a085de55 39 LWIP_UNUSED_ARG(pcb);
pehrhovey 0:a548a085de55 40 if(connection) {
pehrhovey 0:a548a085de55 41 return (connection->recv)(p, err);
pehrhovey 0:a548a085de55 42 }
pehrhovey 0:a548a085de55 43 return ERR_OK;
pehrhovey 0:a548a085de55 44 }
pehrhovey 0:a548a085de55 45
pehrhovey 0:a548a085de55 46 err_t TCPConnection::poll_callback(void *arg, struct tcp_pcb *pcb) {
pehrhovey 0:a548a085de55 47 TCPConnection *connection = static_cast<TCPConnection *>(arg);
pehrhovey 0:a548a085de55 48 LWIP_UNUSED_ARG(pcb);
pehrhovey 0:a548a085de55 49 if(connection) {
pehrhovey 0:a548a085de55 50 return (connection->poll)();
pehrhovey 0:a548a085de55 51 }
pehrhovey 0:a548a085de55 52 return ERR_OK;
pehrhovey 0:a548a085de55 53 }
pehrhovey 0:a548a085de55 54
pehrhovey 0:a548a085de55 55 void TCPConnection::error_callback(void *arg, err_t erra) {
pehrhovey 0:a548a085de55 56 TCPConnection *connection = static_cast<TCPConnection *>(arg);
pehrhovey 0:a548a085de55 57 if(connection) {
pehrhovey 0:a548a085de55 58 (connection->err)(erra);
pehrhovey 0:a548a085de55 59 }
pehrhovey 0:a548a085de55 60 }
pehrhovey 0:a548a085de55 61
pehrhovey 0:a548a085de55 62 TCPConnection::TCPConnection() : _parent(NULL), _port(0) {
pehrhovey 0:a548a085de55 63 }
pehrhovey 0:a548a085de55 64
pehrhovey 0:a548a085de55 65 TCPConnection::TCPConnection(struct ip_addr ip, u16_t port) : _parent(NULL) {
pehrhovey 0:a548a085de55 66 this->_ipaddr = ip;
pehrhovey 0:a548a085de55 67 this->_port = port;
pehrhovey 0:a548a085de55 68 }
pehrhovey 0:a548a085de55 69
pehrhovey 0:a548a085de55 70 TCPConnection::TCPConnection(TCPListener *parent, struct tcp_pcb *pcb)
pehrhovey 0:a548a085de55 71 : TCPItem(pcb), _parent(parent), _ipaddr(pcb->remote_ip), _port(pcb->remote_port) {
pehrhovey 0:a548a085de55 72 tcp_arg(this->_pcb, static_cast<void *>(this));
pehrhovey 0:a548a085de55 73 connected(ERR_OK);
pehrhovey 0:a548a085de55 74 }
pehrhovey 0:a548a085de55 75
pehrhovey 0:a548a085de55 76 TCPConnection::~TCPConnection() {
pehrhovey 0:a548a085de55 77 }
pehrhovey 0:a548a085de55 78
pehrhovey 0:a548a085de55 79 err_t TCPConnection::write(void *msg, u16_t len, u8_t flags) const {
pehrhovey 0:a548a085de55 80 return tcp_write(this->_pcb, msg, len, flags);
pehrhovey 0:a548a085de55 81 }
pehrhovey 0:a548a085de55 82
pehrhovey 0:a548a085de55 83 void TCPConnection::recved(u32_t len) const {
pehrhovey 0:a548a085de55 84 tcp_recved(this->_pcb, len);
pehrhovey 0:a548a085de55 85 }
pehrhovey 0:a548a085de55 86
pehrhovey 0:a548a085de55 87 err_t TCPConnection::connected(err_t err) {
pehrhovey 0:a548a085de55 88 tcp_recv(this->_pcb, TCPConnection::recv_callback);
pehrhovey 0:a548a085de55 89 tcp_sent(this->_pcb, TCPConnection::sent_callback);
pehrhovey 0:a548a085de55 90 tcp_poll(this->_pcb, TCPConnection::poll_callback, 1); // addjust time (in twice a sec)
pehrhovey 0:a548a085de55 91 tcp_err(this->_pcb, TCPConnection::error_callback);
pehrhovey 0:a548a085de55 92 return ERR_OK;
pehrhovey 0:a548a085de55 93 }
pehrhovey 0:a548a085de55 94
pehrhovey 0:a548a085de55 95 void TCPConnection::connect() {
pehrhovey 0:a548a085de55 96 NetServer::ready();
pehrhovey 0:a548a085de55 97 open();
pehrhovey 0:a548a085de55 98 tcp_connect(this->_pcb, &this->_ipaddr, this->_port, TCPConnection::connected_callback);
pehrhovey 0:a548a085de55 99 }
pehrhovey 0:a548a085de55 100
pehrhovey 0:a548a085de55 101 err_t TCPConnection::dnsrequest(const char *hostname, struct ip_addr *addr) const {
pehrhovey 0:a548a085de55 102 return dns_gethostbyname(hostname, addr, TCPConnection::dnsreply_callback, (void *)this);
pehrhovey 0:a548a085de55 103 }