TCP communication

Dependents:   Ethernet

TCP_COMM.cpp

Committer:
13075593
Date:
2016-04-03
Revision:
0:6e800fc6935f
Child:
1:174bf74eba86

File content as of revision 0:6e800fc6935f:

#include "TCP_COMM.h"

TCP_Communication::TCP_Communication()
    :threadSocket(&TCP_Communication::threadReceiverStarter, this, osPriorityHigh,1024)
{
    threadSocket.signal_set(0x01);
}

TCP_Communication::TCP_Communication(string _addr, int _port)
            :threadSocket(&TCP_Communication::threadReceiverStarter, this, osPriorityHigh,1024)
{
    address = _addr.c_str();
    port = _port;
    
    threadSocket.signal_set(0x02);
}

void TCP_Communication::threadServerStarter(const void *args)
{
    printf("Thread Server Starter \n");
    TCP_Communication *instance = (TCP_Communication*)args;
    instance->threadServerWorker();
}

void TCP_Communication::threadReceiverStarter(void const *args)
{
    printf("Thread Receiver Starter \n");
    TCP_Communication *instance = (TCP_Communication*)args;
    instance->threadReceiverWorker();
}

void TCP_Communication::threadServerWorker()
{
    threadSocket.signal_wait(0x01);
    
    TCPSocketServer server;
    server.bind(SERVER_PORT);
    server.listen();
    
    while(1)
    {
        printf("Wait for new connection...\n");
        TCPSocketConnection client;
        server.accept(client);
        client.set_blocking(false, 1500); // Timeout after (1.5)s
        
        printf("Connection from: %s\n", client.get_address());
        char dataBuffer[256];
        while (true) {
            int lengthData = client.receive(dataBuffer, sizeof(dataBuffer));
            if (lengthData <= 0) break;
            
            // print received message to terminal
            dataBuffer[lengthData] = '\0';
            printf("Received message from Client :'%s'\n",dataBuffer);
        }
        client.close();
    } 
}

void TCP_Communication::threadReceiverWorker()
{
    threadSocket.signal_wait(0x02);
    
    while(1)
    {
        printf("Receiver Worker thread \n");
        char message[256];
        int messageLength;
        messageLength = socket.receive(message, 256);
        if(messageLength <= 0)
        {
            printf("This thread yield \n");
            Thread::yield();
            continue;
        }
        message[messageLength] = '\0'; // String end type
        printf("Received message from server: '%s' %i \n", message, messageLength);  
    }
    closeSocketConnection();
}

void TCP_Communication::initSocket()
{
    while (socket.connect(address, port) < 0) {
        printf("Unable to connect to (%s) on port (%d)\n", address, port);
        wait(1);
    }
    printf("Connected to Server at %s\n",address);
}

void TCP_Communication::sendDataSocket(char *data)
{
    printf("Sending  message data to Server : '%s' length %i \n",data, strlen(data));
    socket.send_all(data, strlen(data));
}

void TCP_Communication::closeSocketConnection()
{
    socket.close();
}