TCP communication

Dependents:   Ethernet

TCP_COMM.cpp

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

File content as of revision 1:174bf74eba86:

#include "TCP_COMM.h"
TCP_Communication::TCP_Communication()
            :threadSocket(&TCP_Communication::threadServerStarter, this, osPriorityNormal,1024)
{
    wait(5);
    threadSocket.signal_set(0x01);
}

TCP_Communication::TCP_Communication(string _addr, int _port)
            :threadSocket(&TCP_Communication::threadReceiverStarter, this, osPriorityNormal,1024)
{
    address = _addr.c_str();
    port = _port;
    initSocket();
    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()
{
    printf("Attente du signal\n");
    threadSocket.signal_wait(0x01);
    
    printf("Init Server\n");
    TCPSocketServer server;
    server.bind(SERVER_PORT);
    printf("Server listen\n");
    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;
        printf("Wait to receive data :\n");
        messageLength = socket.receive(message, 256);
        if(messageLength <= 0)
        {
            printf("No message \n");
            Thread::wait(500); 
            continue;
        }
        message[messageLength] = '\0'; // String end type
        printf("Received message from server: '%s' %i \n", message, messageLength);
        Thread::wait(500);  
    }
}


void TCP_Communication::initSocket()
{
    int compteur = 0;
    while (!socket.connect(address, port) && compteur < 0) {
        printf("Unable to connect to (%s) on port (%d)\n", address, port);
        ++compteur;
        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();
}