X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=version2%2Fsrc%2FC%2FCloudComm.cc;fp=version2%2Fsrc%2FC%2FCloudComm.cc;h=0000000000000000000000000000000000000000;hb=786e40250f31eff04eec25bbcaae3cd916fedb14;hp=8fe0ceeb256eddc802a076f3e6289798f0e5a90d;hpb=3f24bffc82ebfe2730308b63100af08645316577;p=iotcloud.git diff --git a/version2/src/C/CloudComm.cc b/version2/src/C/CloudComm.cc deleted file mode 100644 index 8fe0cee..0000000 --- a/version2/src/C/CloudComm.cc +++ /dev/null @@ -1,819 +0,0 @@ -#include "CloudComm.h" -#include "TimingSingleton.h" -#include "SecureRandom.h" -#include "IoTString.h" -#include "Error.h" -#include "URL.h" -#include "Mac.h" -#include "Table.h" -#include "Slot.h" -#include "Crypto.h" -#include "ByteBuffer.h" -#include "aes.h" -#include -#include -#include -#include -#include -#include - -/** - * Empty Constructor needed for child class. - */ -CloudComm::CloudComm() : - baseurl(NULL), - key(NULL), - mac(NULL), - password(NULL), - random(NULL), - salt(NULL), - table(NULL), - listeningPort(-1), - doEnd(false), - timer(TimingSingleton_getInstance()), - getslot(new Array("getslot", 7)), - putslot(new Array("putslot", 7)) -{ -} - -void *threadWrapper(void *cloud) { - CloudComm *c = (CloudComm *) cloud; - c->localServerWorkerFunction(); - return NULL; -} - -/** - * Constructor for actual use. Takes in the url and password. - */ -CloudComm::CloudComm(Table *_table, IoTString *_baseurl, IoTString *_password, int _listeningPort) : - baseurl(new IoTString(_baseurl)), - key(NULL), - mac(NULL), - password(new IoTString(_password)), - random(new SecureRandom()), - salt(NULL), - table(_table), - listeningPort(_listeningPort), - doEnd(false), - timer(TimingSingleton_getInstance()), - getslot(new Array("getslot", 7)), - putslot(new Array("putslot", 7)) { - if (listeningPort > 0) { - pthread_create(&localServerThread, NULL, threadWrapper, this); - } -} - -CloudComm::~CloudComm() { - delete getslot; - delete putslot; - if (salt) - delete salt; - if (password) - delete password; - if (random) - delete random; - if (baseurl) - delete baseurl; - if (mac) - delete mac; - if (key) - delete key; -} - -/** - * Generates Key from password. - */ -AESKey *CloudComm::initKey() { - try { - AESKey *key = new AESKey(password->internalBytes(), - salt, - 65536, - 128); - return key; - } catch (Exception *e) { - throw new Error("Failed generating key."); - } -} - -/** - * Inits all the security stuff - */ - -void CloudComm::initSecurity() { - // try to get the salt and if one does not exist set one - if (!getSalt()) { - //Set the salt - setSalt(); - } - - initCrypt(); -} - -/** - * Inits the HMAC generator. - */ -void CloudComm::initCrypt() { - if (password == NULL) { - return; - } - try { - key = initKey(); - delete password; - password = NULL;// drop password - mac = new Mac(); - mac->init(key); - } catch (Exception *e) { - throw new Error("Failed To Initialize Ciphers"); - } -} - -/* - * Builds the URL for the given request. - */ -IoTString *CloudComm::buildRequest(bool isput, int64_t sequencenumber, int64_t maxentries) { - const char *reqstring = isput ? "req=putslot" : "req=getslot"; - char *buffer = (char *) malloc(baseurl->length() + 200); - memcpy(buffer, baseurl->internalBytes()->internalArray(), baseurl->length()); - int offset = baseurl->length(); - offset += sprintf(&buffer[offset], "?%s&seq=%" PRId64, reqstring, sequencenumber); - if (maxentries != 0) - sprintf(&buffer[offset], "&max=%" PRId64, maxentries); - IoTString *urlstr = new IoTString(buffer); - free(buffer); - return urlstr; -} - -void loopWrite(int fd, char *array, int bytestowrite) { - int byteswritten = 0; - while (bytestowrite) { - int bytes = write(fd, &array[byteswritten], bytestowrite); - if (bytes >= 0) { - byteswritten += bytes; - bytestowrite -= bytes; - } else { - printf("Error in write\n"); - exit(-1); - } - } -} - -void loopRead(int fd, char *array, int bytestoread) { - int bytesread = 0; - while (bytestoread) { - int bytes = read(fd, &array[bytesread], bytestoread); - if (bytes >= 0) { - bytesread += bytes; - bytestoread -= bytes; - } else { - printf("Error in read\n"); - exit(-1); - } - } -} - -WebConnection openURL(IoTString *url) { - if (url->length() < 7 || memcmp(url->internalBytes()->internalArray(), "http://", 7)) { - printf("BOGUS URL\n"); - exit(-1); - } - int i = 7; - for (; i < url->length(); i++) - if (url->get(i) == '/') - break; - - if ( i == url->length()) { - printf("ERROR in openURL\n"); - exit(-1); - } - - char *host = (char *) malloc(i - 6); - memcpy(host, &url->internalBytes()->internalArray()[7], i - 7); - host[i - 7] = 0; - printf("%s\n", host); - - char *message = (char *)malloc(sizeof("POST HTTP/1.1\r\n") + sizeof("Host: \r\n") + 2 * url->length()); - - /* fill in the parameters */ - int post = sprintf(message,"POST "); - /* copy data */ - memcpy(&message[post], &url->internalBytes()->internalArray()[i], url->length() - i); - int endpost = sprintf(&message[post + url->length() - i], " HTTP/1.1\r\n"); - - int hostlen = sprintf(&message[endpost + post + url->length() - i], "Host: "); - memcpy(&message[endpost + post + url->length() + hostlen - i], host, i - 7); - sprintf(&message[endpost + post + url->length() + hostlen - 7], "\r\n"); - - /* create the socket */ - int sockfd = socket(AF_INET, SOCK_STREAM, 0); - if (sockfd < 0) {printf("ERROR opening socket\n"); exit(-1);} - - /* lookup the ip address */ - struct hostent *server = gethostbyname(host); - free(host); - - if (server == NULL) {printf("ERROR, no such host"); exit(-1);} - - /* fill in the structure */ - struct sockaddr_in serv_addr; - - memset(&serv_addr,0,sizeof(serv_addr)); - serv_addr.sin_family = AF_INET; - serv_addr.sin_port = htons(80); - memcpy(&serv_addr.sin_addr.s_addr,server->h_addr,server->h_length); - - /* connect the socket */ - if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) { - printf("ERROR connecting"); - exit(-1); - } - - /* send the request */ - int total = strlen(message); - loopWrite(sockfd, message, total); - free(message); - return (WebConnection) {sockfd, -1}; -} - -int createSocket(IoTString *name, int port) { - char *host = (char *) malloc(name->length() + 1); - memcpy(host, name->internalBytes()->internalArray(), name->length()); - host[name->length()] = 0; - printf("%s\n", host); - /* How big is the message? */ - - /* create the socket */ - int sockfd = socket(AF_INET, SOCK_STREAM, 0); - if (sockfd < 0) {printf("ERROR opening socket\n"); exit(-1);} - - /* lookup the ip address */ - struct hostent *server = gethostbyname(host); - free(host); - - if (server == NULL) {printf("ERROR, no such host"); exit(-1);} - - /* fill in the structure */ - struct sockaddr_in serv_addr; - - memset(&serv_addr,0,sizeof(serv_addr)); - serv_addr.sin_family = AF_INET; - serv_addr.sin_port = htons(port); - memcpy(&serv_addr.sin_addr.s_addr,server->h_addr,server->h_length); - - /* connect the socket */ - if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) { - printf("ERROR connecting"); - exit(-1); - } - - return sockfd; -} - -int createSocket(int port) { - int fd; - struct sockaddr_in sin; - - bzero(&sin, sizeof(sin)); - sin.sin_family = AF_INET; - sin.sin_port = htons(port); - sin.sin_addr.s_addr = htonl(INADDR_ANY); - fd = socket(AF_INET, SOCK_STREAM, 0); - int n = 1; - if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&n, sizeof (n)) < 0) { - close(fd); - printf("Create Socket Error\n"); - exit(-1); - } - if (bind(fd, (struct sockaddr *) &sin, sizeof(sin)) < 0) { - close(fd); - exit(-1); - } - if (listen(fd, 5) < 0) { - close(fd); - exit(-1); - } - return fd; -} - -int acceptSocket(int socket) { - struct sockaddr_in sin; - unsigned int sinlen = sizeof(sin); - int newfd = accept(socket, (struct sockaddr *)&sin, &sinlen); - int flag = 1; - setsockopt(newfd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(flag)); - if (newfd < 0) { - printf("Accept Error\n"); - exit(-1); - } - return newfd; -} - -void writeSocketData(int fd, Array *data) { - loopWrite(fd, data->internalArray(), data->length()); -} - -void writeSocketInt(int fd, int32_t value) { - char array[4]; - array[0] = value >> 24; - array[1] = (value >> 16) & 0xff; - array[2] = (value >> 8) & 0xff; - array[3] = value & 0xff; - loopWrite(fd, array, 4); -} - -int readSocketInt(int fd) { - char array[4]; - loopRead(fd, array, 4); - return (((int32_t)(unsigned char) array[0]) << 24) | - (((int32_t)(unsigned char) array[1]) << 16) | - (((int32_t)(unsigned char) array[2]) << 8) | - ((int32_t)(unsigned char) array[3]); -} - -void readSocketData(int fd, Array *data) { - loopRead(fd, data->internalArray(), data->length()); -} - -void writeURLDataAndClose(WebConnection *wc, Array *data) { - dprintf(wc->fd, "Content-Length: %d\r\n\r\n", data->length()); - loopWrite(wc->fd, data->internalArray(), data->length()); -} - -void closeURLReq(WebConnection *wc) { - dprintf(wc->fd, "\r\n"); -} - -void readURLData(WebConnection *wc, Array *output) { - loopRead(wc->fd, output->internalArray(), output->length()); -} - -int readURLInt(WebConnection *wc) { - char array[4]; - loopRead(wc->fd, array, 4); - return (((int32_t)(unsigned char) array[0]) << 24) | - (((int32_t)(unsigned char) array[1]) << 16) | - (((int32_t)(unsigned char) array[2]) << 8) | - ((int32_t)(unsigned char) array[3]); -} - -void readLine(WebConnection *wc, char *response, int numBytes) { - int offset = 0; - char newchar; - while (true) { - int bytes = read(wc->fd, &newchar, 1); - if (bytes <= 0) - break; - if (offset == (numBytes - 1)) { - printf("Response too long"); - exit(-1); - } - response[offset++] = newchar; - if (newchar == '\n') - break; - } - response[offset] = 0; -} - -int getResponseCode(WebConnection *wc) { - char response[600]; - readLine(wc, response, sizeof(response)); - int ver1 = 0, ver2 = 0, respcode = 0; - sscanf(response, "HTTP/%d.%d %d", &ver1, &ver2, &respcode); - printf("Response code %d\n", respcode); - return respcode; -} - -void readHeaders(WebConnection *wc) { - char response[600]; - int numBytes; - - while (true) { - readLine(wc, response, sizeof(response)); - if (response[0] == '\r') - return; - else if (memcmp(response, "Content-Length:", sizeof("Content-Length:") - 1) == 0) { - sscanf(response, "Content-Length: %d", &numBytes); - wc->numBytes = numBytes; - } - } -} - -void CloudComm::setSalt() { - if (salt != NULL) { - // Salt already sent to server so don't set it again - return; - } - - WebConnection wc = {-1, -1}; - try { - Array *saltTmp = new Array(CloudComm_SALT_SIZE); - random->nextBytes(saltTmp); - - char *buffer = (char *) malloc(baseurl->length() + 100); - memcpy(buffer, baseurl->internalBytes()->internalArray(), baseurl->length()); - int offset = baseurl->length(); - offset += sprintf(&buffer[offset], "?req=setsalt"); - IoTString *urlstr = new IoTString(buffer); - free(buffer); - - timer->startTime(); - wc = openURL(urlstr); - delete urlstr; - writeURLDataAndClose(&wc, saltTmp); - - int responsecode = getResponseCode(&wc); - if (responsecode != HttpURLConnection_HTTP_OK) { - throw new Error("Invalid response"); - } - close(wc.fd); - - timer->endTime(); - salt = saltTmp; - } catch (Exception *e) { - timer->endTime(); - throw new ServerException("Failed setting salt", ServerException_TypeConnectTimeout); - } -} - -bool CloudComm::getSalt() { - WebConnection wc = {-1, -1}; - IoTString *urlstr = NULL; - - try { - char *buffer = (char *) malloc(baseurl->length() + 100); - memcpy(buffer, baseurl->internalBytes()->internalArray(), baseurl->length()); - int offset = baseurl->length(); - offset += sprintf(&buffer[offset], "?req=getsalt"); - urlstr = new IoTString(buffer); - free(buffer); - } catch (Exception *e) { - throw new Error("getSlot failed"); - } - try { - timer->startTime(); - wc = openURL(urlstr); - delete urlstr; - urlstr = NULL; - closeURLReq(&wc); - timer->endTime(); - } catch (SocketTimeoutException *e) { - if (urlstr) - delete urlstr; - timer->endTime(); - throw new ServerException("getSalt failed", ServerException_TypeConnectTimeout); - } catch (Exception *e) { - if (urlstr) - delete urlstr; - throw new Error("getSlot failed"); - } - - try { - timer->startTime(); - int responsecode = getResponseCode(&wc); - readHeaders(&wc); - if (responsecode != HttpURLConnection_HTTP_OK) { - throw new Error("Invalid response"); - } - if (wc.numBytes == 0) { - timer->endTime(); - close(wc.fd); - return false; - } - - - int salt_length = readURLInt(&wc); - Array *tmp = new Array(salt_length); - readURLData(&wc, tmp); - close(wc.fd); - - salt = tmp; - timer->endTime(); - return true; - } catch (SocketTimeoutException *e) { - timer->endTime(); - throw new ServerException("getSalt failed", ServerException_TypeInputTimeout); - } catch (Exception *e) { - throw new Error("getSlot failed"); - } -} - -Array *CloudComm::createIV(int64_t machineId, int64_t localSequenceNumber) { - ByteBuffer *buffer = ByteBuffer_allocate(CloudComm_IV_SIZE); - buffer->putLong(machineId); - int64_t localSequenceNumberShifted = localSequenceNumber << 16; - buffer->putLong(localSequenceNumberShifted); - return buffer->array(); -} - -Array *AESEncrypt(Array *ivBytes, AESKey *key, Array *data) { - Array *output = new Array(data->length()); - aes_encrypt_ctr((BYTE *)data->internalArray(), data->length(), (BYTE *) output->internalArray(), (WORD *)key->getKeySchedule(), key->getKey()->length() * 8, (BYTE *)ivBytes->internalArray()); - return output; -} - -Array *AESDecrypt(Array *ivBytes, AESKey *key, Array *data) { - Array *output = new Array(data->length()); - aes_decrypt_ctr((BYTE *)data->internalArray(), data->length(), (BYTE *)output->internalArray(), (WORD *)key->getKeySchedule(), key->getKey()->length() * 8, (BYTE *)ivBytes->internalArray()); - return output; -} - -Array *CloudComm::encryptSlotAndPrependIV(Array *rawData, Array *ivBytes) { - try { - Array *encryptedBytes = AESEncrypt(ivBytes, key, rawData); - Array *chars = new Array(encryptedBytes->length() + CloudComm_IV_SIZE); - System_arraycopy(ivBytes, 0, chars, 0, ivBytes->length()); - System_arraycopy(encryptedBytes, 0, chars, CloudComm_IV_SIZE, encryptedBytes->length()); - delete encryptedBytes; - return chars; - } catch (Exception *e) { - throw new Error("Failed To Encrypt"); - } -} - -Array *CloudComm::stripIVAndDecryptSlot(Array *rawData) { - try { - Array *ivBytes = new Array(CloudComm_IV_SIZE); - Array *encryptedBytes = new Array(rawData->length() - CloudComm_IV_SIZE); - System_arraycopy(rawData, 0, ivBytes, 0, CloudComm_IV_SIZE); - System_arraycopy(rawData, CloudComm_IV_SIZE, encryptedBytes, 0, encryptedBytes->length()); - Array * data = AESDecrypt(ivBytes, key, encryptedBytes); - delete encryptedBytes; - delete ivBytes; - return data; - } catch (Exception *e) { - throw new Error("Failed To Decrypt"); - } -} - -/* - * API for putting a slot into the queue. Returns NULL on success. - * On failure, the server will send slots with newer sequence - * numbers. - */ -Array *CloudComm::putSlot(Slot *slot, int max) { - WebConnection wc = {-1, -1}; - try { - if (salt == NULL) { - if (!getSalt()) { - throw new ServerException("putSlot failed", ServerException_TypeSalt); - } - initCrypt(); - } - - int64_t sequencenumber = slot->getSequenceNumber(); - Array *slotBytes = slot->encode(mac); - Array * ivBytes = slot->getSlotCryptIV(); - Array *chars = encryptSlotAndPrependIV(slotBytes, ivBytes); - delete ivBytes; - delete slotBytes; - IoTString *url = buildRequest(true, sequencenumber, max); - timer->startTime(); - wc = openURL(url); - delete url; - writeURLDataAndClose(&wc, chars); - delete chars; - timer->endTime(); - } catch (ServerException *e) { - timer->endTime(); - throw e; - } catch (SocketTimeoutException *e) { - timer->endTime(); - throw new ServerException("putSlot failed", ServerException_TypeConnectTimeout); - } catch (Exception *e) { - throw new Error("putSlot failed"); - } - - Array *resptype = NULL; - try { - int respcode = getResponseCode(&wc); - readHeaders(&wc); - timer->startTime(); - resptype = new Array(7); - readURLData(&wc, resptype); - timer->endTime(); - - if (resptype->equals(getslot)) { - delete resptype; - Array *tmp = processSlots(&wc); - close(wc.fd); - return tmp; - } else if (resptype->equals(putslot)) { - delete resptype; - close(wc.fd); - return NULL; - } else { - delete resptype; - close(wc.fd); - throw new Error("Bad response to putslot"); - } - } catch (SocketTimeoutException *e) { - if (resptype != NULL) - delete resptype; - timer->endTime(); - close(wc.fd); - throw new ServerException("putSlot failed", ServerException_TypeInputTimeout); - } catch (Exception *e) { - if (resptype != NULL) - delete resptype; - throw new Error("putSlot failed"); - } -} - -/** - * Request the server to send all slots with the given - * sequencenumber or newer-> - */ -Array *CloudComm::getSlots(int64_t sequencenumber) { - WebConnection wc = {-1, -1}; - try { - if (salt == NULL) { - if (!getSalt()) { - throw new ServerException("getSlots failed", ServerException_TypeSalt); - } - initCrypt(); - } - - IoTString *url = buildRequest(false, sequencenumber, 0); - timer->startTime(); - wc = openURL(url); - delete url; - closeURLReq(&wc); - timer->endTime(); - } catch (SocketTimeoutException *e) { - timer->endTime(); - throw new ServerException("getSlots failed", ServerException_TypeConnectTimeout); - } catch (ServerException *e) { - timer->endTime(); - - throw e; - } catch (Exception *e) { - throw new Error("getSlots failed"); - } - - try { - timer->startTime(); - int responsecode = getResponseCode(&wc); - readHeaders(&wc); - Array *resptype = new Array(7); - readURLData(&wc, resptype); - timer->endTime(); - if (!resptype->equals(getslot)) - throw new Error("Bad Response: "); - - delete resptype; - Array *tmp = processSlots(&wc); - close(wc.fd); - return tmp; - } catch (SocketTimeoutException *e) { - timer->endTime(); - close(wc.fd); - throw new ServerException("getSlots failed", ServerException_TypeInputTimeout); - } catch (Exception *e) { - throw new Error("getSlots failed"); - } -} - -/** - * Method that actually handles building Slot objects from the - * server response. Shared by both putSlot and getSlots. - */ -Array *CloudComm::processSlots(WebConnection *wc) { - int numberofslots = readURLInt(wc); - Array *sizesofslots = new Array(numberofslots); - Array *slots = new Array(numberofslots); - - for (int i = 0; i < numberofslots; i++) - sizesofslots->set(i, readURLInt(wc)); - for (int i = 0; i < numberofslots; i++) { - Array *rawData = new Array(sizesofslots->get(i)); - readURLData(wc, rawData); - Array *data = stripIVAndDecryptSlot(rawData); - delete rawData; - slots->set(i, Slot_decode(table, data, mac)); - delete data; - } - delete sizesofslots; - return slots; -} - -Array *CloudComm::sendLocalData(Array *sendData, int64_t localSequenceNumber, IoTString *host, int port) { - if (salt == NULL) - return NULL; - try { - printf("Passing Locally\n"); - mac->update(sendData, 0, sendData->length()); - Array *genmac = mac->doFinal(); - Array *totalData = new Array(sendData->length() + genmac->length()); - System_arraycopy(sendData, 0, totalData, 0, sendData->length()); - System_arraycopy(genmac, 0, totalData, sendData->length(), genmac->length()); - - // Encrypt the data for sending - Array *iv = createIV(table->getMachineId(), table->getLocalSequenceNumber()); - Array *encryptedData = encryptSlotAndPrependIV(totalData, iv); - - // Open a TCP socket connection to a local device - int socket = createSocket(host, port); - - timer->startTime(); - // Send data to output (length of data, the data) - writeSocketInt(socket, encryptedData->length()); - writeSocketData(socket, encryptedData); - - int lengthOfReturnData = readSocketInt(socket); - Array *returnData = new Array(lengthOfReturnData); - readSocketData(socket, returnData); - timer->endTime(); - returnData = stripIVAndDecryptSlot(returnData); - - // We are done with this socket - close(socket); - mac->update(returnData, 0, returnData->length() - CloudComm_HMAC_SIZE); - Array *realmac = mac->doFinal(); - Array *recmac = new Array(CloudComm_HMAC_SIZE); - System_arraycopy(returnData, returnData->length() - realmac->length(), recmac, 0, realmac->length()); - - if (!recmac->equals(realmac)) - throw new Error("Local Error: Invalid HMAC! Potential Attack!"); - - Array *returnData2 = new Array(lengthOfReturnData - recmac->length()); - System_arraycopy(returnData, 0, returnData2, 0, returnData2->length()); - - return returnData2; - } catch (Exception *e) { - printf("Exception\n"); - } - - return NULL; -} - -void CloudComm::localServerWorkerFunction() { - int inputSocket = -1; - - try { - // Local server socket - inputSocket = createSocket(listeningPort); - } catch (Exception *e) { - throw new Error("Local server setup failure..."); - } - - while (!doEnd) { - try { - // Accept incoming socket - int socket = acceptSocket(inputSocket); - - // Get the encrypted data from the server - int dataSize = readSocketInt(socket); - Array *readData = new Array(dataSize); - readSocketData(socket, readData); - timer->endTime(); - - // Decrypt the data - readData = stripIVAndDecryptSlot(readData); - mac->update(readData, 0, readData->length() - CloudComm_HMAC_SIZE); - Array *genmac = mac->doFinal(); - Array *recmac = new Array(CloudComm_HMAC_SIZE); - System_arraycopy(readData, readData->length() - recmac->length(), recmac, 0, recmac->length()); - - if (!recmac->equals(genmac)) - throw new Error("Local Error: Invalid HMAC! Potential Attack!"); - - Array *returnData = new Array(readData->length() - recmac->length()); - System_arraycopy(readData, 0, returnData, 0, returnData->length()); - - // Process the data - Array *sendData = table->acceptDataFromLocal(returnData); - mac->update(sendData, 0, sendData->length()); - Array *realmac = mac->doFinal(); - Array *totalData = new Array(sendData->length() + realmac->length()); - System_arraycopy(sendData, 0, totalData, 0, sendData->length()); - System_arraycopy(realmac, 0, totalData, sendData->length(), realmac->length()); - - // Encrypt the data for sending - Array *iv = createIV(table->getMachineId(), table->getLocalSequenceNumber()); - Array *encryptedData = encryptSlotAndPrependIV(totalData, iv); - - timer->startTime(); - // Send data to output (length of data, the data) - writeSocketInt(socket, encryptedData->length()); - writeSocketData(socket, encryptedData); - close(socket); - } catch (Exception *e) { - } - } - - if (inputSocket != -1) { - try { - close(inputSocket); - } catch (Exception *e) { - throw new Error("Local server close failure..."); - } - } -} - -void CloudComm::closeCloud() { - doEnd = true; - - if (listeningPort > 0) { - if (pthread_join(localServerThread, NULL) != 0) - throw new Error("Local Server thread join issue..."); - } -}