TCPTest Server attempt

Dependencies:   EthernetNetIf mbed

main.cpp

Committer:
OTBsolar
Date:
2011-03-15
Revision:
1:7785624d8f35
Parent:
0:f8aba92e4c46

File content as of revision 1:7785624d8f35:

#include "mbed.h"
#include "EthernetNetIf.h"
#include "TCPSocket.h"

EthernetNetIf eth;
DigitalOut led1(LED1);


TCPSocket tcp;  //The listening port where requests are queued
TCPSocket* link; //The port where accepted requests can communicate

Host local(IpAddr(130,144,2,83), 12345); //mbed IP
Host client;

TCPSocketErr accErr;

void onLinkSocketEvent(TCPSocketEvent e)
{
   switch(e)
    {
    case TCPSOCKET_CONNECTED:
        printf("TCP Socket Connected\r\n");
        break;
    case TCPSOCKET_WRITEABLE:
      //Can now write some data...
        printf("TCP Socket Writable\r\n");
        break;
    case TCPSOCKET_READABLE:
      //Can now read dome data...
        printf("TCP Socket Readable\r\n");
       // Read in any available data into the buffer
       char buff[128];
       while ( int len = link->recv(buff, 128) ) {
       // And send straight back out again
           link->send(buff, len);
           buff[len]=0; // make terminater
           printf("Received&Wrote:%s\r\n",buff);
       }
       break;
    case TCPSOCKET_CONTIMEOUT:
        printf("TCP Socket Timeout\r\n");
        break;
    case TCPSOCKET_CONRST:
        printf("TCP Socket CONRST\r\n");
        break;
    case TCPSOCKET_CONABRT:
        printf("TCP Socket CONABRT\r\n");
        break;
    case TCPSOCKET_ERROR:
        printf("TCP Socket Error\r\n");
        break;
    case TCPSOCKET_DISCONNECTED:
    //Close socket...
        printf("TCP Socket Disconnected\r\n");        
        link->close();
        break;
    default:
        printf("DEFAULT\r\n"); 
      }
}

void onTCPSocketEvent(TCPSocketEvent e)
{
    switch(e) {
        case TCPSOCKET_CONNECTED:
            printf("Connected\n");
        break;
        
        case TCPSOCKET_ACCEPT: {
            accErr = tcp.accept(&client,&link);
            switch(accErr) {
                case TCPSOCKET_SETUP:   printf("Err:Setup\n");      break;  //TCPSocket not properly configured.
                case TCPSOCKET_TIMEOUT: printf("Err:Timeout\n");    break;  //Connection timed out.
                case TCPSOCKET_IF:      printf("Err:Interface\n");  break;  //Interface has problems, does not exist or is not initialized.
                case TCPSOCKET_MEM:     printf("Err:Memory\n");     break;  //Not enough mem.
                case TCPSOCKET_INUSE:   printf("Err:In use\n");     break;  //Interface / Port is in use.
                case TCPSOCKET_EMPTY:   printf("Err:Empty\n");      break;  //Connections queue is empty.
                case TCPSOCKET_RST:     printf("Err:Reset\n");      break;  //Connection was reset by remote host.
                case TCPSOCKET_OK:      printf("Accepted: ");       break;  //Success. 
            }
            link->setOnEvent(&onLinkSocketEvent);
            IpAddr clientIp = client.getIp();
            printf("Incoming TCP connection from %d.%d.%d.%d\r\n", 
            clientIp[0], clientIp[1], clientIp[2], clientIp[3]);
        }
        break;
        
        case TCPSOCKET_READABLE:
            printf("Readable\n");
        break;
        
        case TCPSOCKET_WRITEABLE:
            printf("Writeable\n");
        break;
        
        case TCPSOCKET_CONTIMEOUT:
            printf("Timeout\n");
        break;
        
        case TCPSOCKET_CONRST:
            printf("Reset\n");
        break;
        case TCPSOCKET_CONABRT:
            printf("Aborted\n");
        break;
        
        case TCPSOCKET_ERROR:
            printf("Error\n");
        break;
        
        case TCPSOCKET_DISCONNECTED:
            printf("Disconnected\n");
            tcp.close();
        break;    
    }
}

int main() {
    //********Basic setup********
    printf("Welcome to wireFUSE\n");
    printf("Setting up...\n");
    EthernetErr ethErr = eth.setup();
    if(ethErr)
    {
        printf("Error %d in setup.\n", ethErr);
        return -1;
    }
    printf("Setup OK\n");
    //****End of basic setup*****
    
    tcp.setOnEvent(&onTCPSocketEvent); //Generate method to deal with requests
    
    //Bind to local port
    printf("Init bind..\n");
    TCPSocketErr bindErr = tcp.bind(local);
    switch(bindErr) {
    case TCPSOCKET_SETUP:   printf("Err:Setup\n");      break;  //TCPSocket not properly configured.
    case TCPSOCKET_TIMEOUT: printf("Err:Timeout\n");    break;  //Connection timed out.
    case TCPSOCKET_IF:      printf("Err:Interface\n");  break;  //Interface has problems, does not exist or is not initialized.
    case TCPSOCKET_MEM:     printf("Err:Memory\n");     break;  //Not enough mem.
    case TCPSOCKET_INUSE:   printf("Err:In use\n");     break;  //Interface / Port is in use.
    case TCPSOCKET_EMPTY:   printf("Err:Empty\n");      break;  //Connections queue is empty.
    case TCPSOCKET_RST:     printf("Err:Reset\n");      break;  //Connection was reset by remote host.
    case TCPSOCKET_OK:      printf("Bound to port\n");  break;  //Success. 
    }
            
    //Listen to local port
    printf("Init listen..\n");
    TCPSocketErr listenErr = tcp.listen();
    switch(listenErr) {
    case TCPSOCKET_SETUP:   printf("Err:Setup\n");      break;  //TCPSocket not properly configured.
    case TCPSOCKET_TIMEOUT: printf("Err:Timeout\n");    break;  //Connection timed out.
    case TCPSOCKET_IF:      printf("Err:Interface\n");  break;  //Interface has problems, does not exist or is not initialized.
    case TCPSOCKET_MEM:     printf("Err:Memory\n");     break;  //Not enough mem.
    case TCPSOCKET_INUSE:   printf("Err:In use\n");     break;  //Interface / Port is in use.
    case TCPSOCKET_EMPTY:   printf("Err:Empty\n");      break;  //Connections queue is empty.
    case TCPSOCKET_RST:     printf("Err:Reset\n");      break;  //Connection was reset by remote host.
    case TCPSOCKET_OK:      printf("Listening\n");      break;  //Success. 
    }
    Timer tmr;
    tmr.start();
    while(1)
    {
        Net::poll();
        if(tmr.read() > 2)
        {
            tmr.reset();
            led1=!led1; //Show that we are alive
            
            //Wait for a connection request
            printf("waiting for client on port 12345\n");
        }
    }
}