Beispiel #1
0
int ServerNodePort::waitNodeConnection()
{
	int sock = 0;

	sock = NodeNetwork::setupServerSocket(this->mpOwner->mpServerAddress, this->mpOwner->mServerPort);

	if (sock < 0)
	{
		LOGE("Server Socket Setup Failure\n");
		return sock;
	}

	int loop = 1;

	while (loop == 1)
	{
        ClientAddress_t addr;
        char logFileName[LOG_FILE_NAME_LENGTH];
        memset(logFileName, 0, LOG_FILE_NAME_LENGTH);

		int client = NodeNetwork::acceptOnSocket(sock, &addr);

		// Create IP string
		char clientName[NODE_NAME_LENGTH+1];
        sprintf(clientName, "%s", addr.ipstr);

	#if (USE_IP_CHECKER == 1)

        char IP_CHECK[NODE_NAME_LENGTH+1];
        sprintf(IP_CHECK, "%s", addr.ipstr);

        char *host = strtok(IP_CHECK, ".");
        host = strtok(NULL, ".");
        host = strtok(NULL, ".");
        host = strtok(NULL, ".");

        if (strcmp(host, "0") == 0)
		{
        	LOGW("Illegal Connection: %s", clientName);

        	close(sock);

        	close(client);

			sleep(2);

        	sock = NodeNetwork::setupServerSocket(this->mpOwner->mpServerAddress, this->mpOwner->mServerPort);

			if (sock < 0)
			{
				LOGE("Server Socket Setup Failure\n");
				return sock;
			}

        	continue;
		}

	#endif

        char dirPath[LOG_FILE_NAME_LENGTH];

		memset(dirPath, 0, LOG_FILE_NAME_LENGTH);

		sprintf(dirPath, "%s/%s", (char *)LOCK_DIR, clientName);

		int fd = open(dirPath, O_RDWR, 0755);

		if (fd < 0)
		{
			fd = creat(dirPath, 0755);
			close(fd);
		}
		else
		{
			close(fd);

			continue;
		}

	#if (USE_NODE_CREATION_THREAD == 1)

        ClientNodeArgument *pArg = new ClientNodeArgument;

        pArg->sock = client;
        memset(pArg->clientName, 0, NODE_NAME_LENGTH+1);
        strcpy(pArg->clientName, clientName);
        pArg->pOwner = this->mpOwner;
        pArg->gid = this->mpOwner->getGID()+1;
        this->mpOwner->setGID(pArg->gid);

        //pArg->gid = ++gGlobalClientID;

        ThreadHelper::run(createClientNodeThread, pArg, TRUE);
		
	#else
		// Send IP string
		NodeNetwork::sendToSocket(client, clientName, NODE_NAME_LENGTH);

		// Receive Private IP_Public IP
		NodeNetwork::receiveFromSocket(client, clientName, NODE_NAME_LENGTH);

        sprintf(logFileName, "%s", clientName);
		LOGI("New Client Node Accepted: %s", clientName);

		// Register End.

		ClientNode* pClientNode;

		pClientNode = new ClientNode(client, clientName, this->mpOwner);
		pClientNode->prepare(logFileName);

		unlink(dirPath);
	#endif
	}

	return sock;
}
Beispiel #2
0
void* createClientNodeThread(void *pArg)
{
	int sent = 0;
	ClientNodeArgument *pNodeArg = (ClientNodeArgument *)pArg;
	char logFileName[LOG_FILE_NAME_LENGTH];
	char dirPath[LOG_FILE_NAME_LENGTH];

	memset(dirPath, 0, LOG_FILE_NAME_LENGTH);

	sprintf(dirPath, "%s/%s", (char *)LOCK_DIR, pNodeArg->clientName);

	memset(logFileName, 0, LOG_FILE_NAME_LENGTH);

	// Send IP string
	sent = NodeNetwork::sendToSocket(pNodeArg->sock, pNodeArg->clientName, NODE_NAME_LENGTH);

	if (sent <= 0)
	{
		delete pNodeArg;

		return NULL;
	}

	// Receive Private IP_Public IP
	int tempLength = NODE_NAME_LENGTH + 1 + strlen(NBUS_PACKET_START_CODE);
	char tempBuffer[tempLength];

	sent = NodeNetwork::receiveFromSocket(pNodeArg->sock, tempBuffer, tempLength-1);

	if (strncmp(NBUS_PACKET_START_CODE, tempBuffer, strlen(NBUS_PACKET_START_CODE)))
	{
		LOGE("Invalid Client Accepted");

		delete pNodeArg;
		return NULL;
	}
	//sent = NodeNetwork::receiveFromSocket(pNodeArg->sock, pNodeArg->clientName, NODE_NAME_LENGTH);

	if (sent <= 0)
	{
		delete pNodeArg;

		return NULL;
	}

	strncpy(pNodeArg->clientName, tempBuffer + strlen(NBUS_PACKET_START_CODE), NODE_NAME_LENGTH);

	snprintf(logFileName, NODE_NAME_LENGTH, "%s", pNodeArg->clientName);
	LOGI("New Client Node Accepted: %s", pNodeArg->clientName);

	ClientNode* pClientNode;

	pClientNode = new ClientNode(pNodeArg->sock, pNodeArg->clientName, pNodeArg->pOwner);

	if (pClientNode->getGID() == 0)
	{
		pClientNode->setGID(pNodeArg->gid);
	}

	pClientNode->prepare(logFileName);

	unlink(dirPath);

	delete pNodeArg;

	return NULL;
}