#include <pthread.h>
#include "PassiveSocket.h"

#ifdef WIN32
#include <windows.h>

  // usually defined with #include <unistd.h>
  static void sleep( unsigned int seconds )
  {
    Sleep( seconds * 1000 );
  }
#endif

#define MAX_PACKET  4096
#define TEST_PACKET "Test Packet"

struct thread_data
{
    const char *pszServerAddr;
    short int   nPort;
    int         nNumBytesToReceive;
    int         nTotalPayloadSize;
};


void *CreateTCPEchoServer(void *param)
{
    CPassiveSocket socket;
    CActiveSocket *pClient = NULL;
    struct thread_data *pData = (struct thread_data *)param;
    int            nBytesReceived = 0;

    socket.Initialize();
    socket.Listen(pData->pszServerAddr, pData->nPort);

    if ((pClient = socket.Accept()) != NULL)
    {
        while (nBytesReceived != pData->nTotalPayloadSize)
        {
            if (nBytesReceived += pClient->Receive(pData->nNumBytesToReceive))
            {
                pClient->Send((const uint8 *)pClient->GetData(), pClient->GetBytesReceived());
            }
        }

        sleep(100);

        delete pClient;
    }

    socket.Close();

    return NULL;
}

int main(int argc, char **argv)
{
    pthread_t          threadId;
    struct thread_data thData;
    CActiveSocket      client;
    char result[1024];

    thData.pszServerAddr = "127.0.0.1";
    thData.nPort = 6789;
    thData.nNumBytesToReceive = 1;
    thData.nTotalPayloadSize = (int)strlen(TEST_PACKET);

    pthread_create(&threadId, 0, CreateTCPEchoServer, &thData);
    sleep(1); // allow a second for the thread to create and listen

    client.Initialize();
    client.SetNonblocking();

    if (client.Open("127.0.0.1", 6789))
    {
        if (client.Send((uint8 *)TEST_PACKET, strlen(TEST_PACKET)))
        {
            int numBytes = -1;
            int bytesReceived = 0;

            client.Select();

            while (bytesReceived != strlen(TEST_PACKET))
            {
                numBytes = client.Receive(MAX_PACKET);

                if (numBytes > 0)
                {
                    bytesReceived += numBytes;
                    memset(result, 0, 1024);
                    memcpy(result, client.GetData(), numBytes);
                    printf("received %d bytes: '%s'\n", numBytes, result);
                }
                else
                {
                    printf("Received %d bytes\n", numBytes);
                }
            }
        }
    }
}
