/* Stops the TCP client. CLITCP* pCLITCP : (IN,OUT) pointer to the data structure representing the client Returns : EXIT_SUCCESS or EXIT_FAILURE if there is an error */ int StopCLITCP(CLITCP* pCLITCP) { int EndThread = 1; if((pCLITCP == NULL) || (pCLITCP->initialized != 1)) { return EXIT_FAILURE; } pCLITCP->initialized = 0; memcpy_ts((char*)&pCLITCP->EndThread, (char*)&EndThread, sizeof(int), &pCLITCP->CSEndThread); // Thread-safe copy if (WaitForThread(pCLITCP->ThrId) != EXIT_SUCCESS) { DelCriticalSection(&pCLITCP->CSEndThread); DelCriticalSection(&pCLITCP->CSconnected); StopTCP(&pCLITCP->ConnectSocket, &pCLITCP->addrinf); free(pCLITCP->address);pCLITCP->address = NULL; free(pCLITCP->port);pCLITCP->port = NULL; return EXIT_FAILURE; } DelCriticalSection(&pCLITCP->CSEndThread); DelCriticalSection(&pCLITCP->CSconnected); if(StopTCP(&pCLITCP->ConnectSocket, &pCLITCP->addrinf) != EXIT_SUCCESS) { free(pCLITCP->address);pCLITCP->address = NULL; free(pCLITCP->port);pCLITCP->port = NULL; return EXIT_FAILURE; } free(pCLITCP->address);pCLITCP->address = NULL; free(pCLITCP->port);pCLITCP->port = NULL; return EXIT_SUCCESS; }
DWORD WINAPI ConnectThrProc(LPVOID lpParam) { #else void* ConnectThrProc(void* lpParam) { #endif int EndThread = 0; CLITCP* pCLITCP = (CLITCP*)lpParam; int connected = 0; do { memcpy_ts(&connected, &pCLITCP->connected, sizeof(int), &pCLITCP->CSconnected); // Thread-safe copy if (connected != 1) { // The client is not connected to the server, trying to connect or reconnect StopTCP(&pCLITCP->ConnectSocket, &pCLITCP->addrinf); if ( (InitTCP(&pCLITCP->ConnectSocket, pCLITCP->address, pCLITCP->port, &pCLITCP->addrinf) == EXIT_SUCCESS)&& // (SetSockOptTCP(pCLITCP->ConnectSocket, 1, 10000) == EXIT_SUCCESS)&& // Setting timeouts on the client socket (ConnectTCP(&pCLITCP->ConnectSocket, &pCLITCP->addrinf) == EXIT_SUCCESS)//&& // (SetSockOptTCP(pCLITCP->ConnectSocket, 1, 10000) == EXIT_SUCCESS) // Setting timeouts on the client socket ) { fprintf(stdout, "Connection successful\n"); connected = 1; memcpy_ts(&pCLITCP->connected, &connected, sizeof(int), &pCLITCP->CSconnected); // Thread-safe copy } else fprintf(stdout, "Unable to connect\n"); } mSleep(1000); memcpy_ts(&EndThread, &pCLITCP->EndThread, sizeof(int), &pCLITCP->CSEndThread); // Thread-safe copy } while(!EndThread); return 0; }
CTCPIOCP::~CTCPIOCP(void) { DeleteCriticalSection(&m_recvPackagesListLok); StopTCP(); WSACleanup(); }
/* Initializes the TCP client. CLITCP* pCLITCP : (IN,OUT) pointer to the data structure representing the client char* address : (IN) server address to connect char* port : (IN) server port to connect Returns : EXIT_SUCCESS or EXIT_FAILURE if there is an error */ int InitCLITCP(CLITCP* pCLITCP, char* address, char* port) { int EndThread = 1; if((pCLITCP == NULL) || (pCLITCP->initialized == 1)) { return EXIT_FAILURE; } pCLITCP->address = (char*)calloc(strlen(address)+1, sizeof(char)); sprintf(pCLITCP->address, "%s", address); pCLITCP->port = (char*)calloc(strlen(port)+1, sizeof(char)); sprintf(pCLITCP->port, "%s", port); pCLITCP->ConnectSocket = INVALID_SOCKET; pCLITCP->addrinf = NULL; pCLITCP->EndThread = 0; pCLITCP->connected = 0; if ( (InitTCP(&pCLITCP->ConnectSocket, pCLITCP->address, pCLITCP->port, &pCLITCP->addrinf) == EXIT_SUCCESS)&& // (SetSockOptTCP(pCLITCP->ConnectSocket, 1, 10000) == EXIT_SUCCESS)&& // Setting timeouts on the client socket (ConnectTCP(&pCLITCP->ConnectSocket, &pCLITCP->addrinf) == EXIT_SUCCESS)//&& // (SetSockOptTCP(pCLITCP->ConnectSocket, 1, 10000) == EXIT_SUCCESS) // Setting timeouts on the client socket ) { fprintf(stdout, "Connection successful\n"); pCLITCP->connected = 1; } else fprintf(stdout, "Unable to connect\n"); if (InitCriticalSection(&pCLITCP->CSEndThread) != EXIT_SUCCESS) { StopTCP(&pCLITCP->ConnectSocket, &pCLITCP->addrinf); free(pCLITCP->address);pCLITCP->address = NULL; free(pCLITCP->port);pCLITCP->port = NULL; return EXIT_FAILURE; } if (InitCriticalSection(&pCLITCP->CSconnected) != EXIT_SUCCESS) { DelCriticalSection(&pCLITCP->CSEndThread); StopTCP(&pCLITCP->ConnectSocket, &pCLITCP->addrinf); free(pCLITCP->address);pCLITCP->address = NULL; free(pCLITCP->port);pCLITCP->port = NULL; return EXIT_FAILURE; } if (CreateDefaultThread(ConnectThrProc, pCLITCP, &pCLITCP->ThrId) != EXIT_SUCCESS) { DelCriticalSection(&pCLITCP->CSEndThread); DelCriticalSection(&pCLITCP->CSconnected); StopTCP(&pCLITCP->ConnectSocket, &pCLITCP->addrinf); free(pCLITCP->address);pCLITCP->address = NULL; free(pCLITCP->port);pCLITCP->port = NULL; return EXIT_FAILURE; } if (SetThreadDefaultPriority(pCLITCP->ThrId, THREAD_PRIORITY_NORMAL) != EXIT_SUCCESS) { EndThread = 1; memcpy_ts((char*)&pCLITCP->EndThread, (char*)&EndThread, sizeof(int), &pCLITCP->CSEndThread); // Thread-safe copy WaitForThread(pCLITCP->ThrId); DelCriticalSection(&pCLITCP->CSEndThread); DelCriticalSection(&pCLITCP->CSconnected); StopTCP(&pCLITCP->ConnectSocket, &pCLITCP->addrinf); free(pCLITCP->address);pCLITCP->address = NULL; free(pCLITCP->port);pCLITCP->port = NULL; return EXIT_FAILURE; } pCLITCP->initialized = 1; return EXIT_SUCCESS; }