void Start_Visualizer(Socket_with_Event *arg)
{

	//recv an id
	DWORD dwID = 0;
	DWORD dwForeignProcID = 0;

	//Get the node's identifier
	while (SOCKET_ERROR == recv(arg->sock, (char*)&dwID, sizeof(DWORD), 0))
	{
		int error;
		char msg[256];
		error = WSAGetLastError();
		if (error == WSAEWOULDBLOCK)
		{
			Sleep(0);
			continue;		
		}
		translate_WSAErrorCode(error, msg);
		fdebug2("Socket Error dwID: %i, %s\n", error, msg);
		closesocket(arg->sock);
		WSACloseEvent(arg->sock_event);
		delete arg;
		ExitThread(0);
	}
	
	//get the foreign ProcID
	while (SOCKET_ERROR == recv(arg->sock, (char*)&dwForeignProcID, sizeof(DWORD), 0))
	{
		int error;
		char msg[256];
		error = WSAGetLastError();
		if (error == WSAEWOULDBLOCK)
		{
			Sleep(0);
			continue;		
		}
		translate_WSAErrorCode(error, msg);
		fdebug2("Socket Error dwID: %i, %s\n", error, msg);
		closesocket(arg->sock);
		WSACloseEvent(arg->sock_event);
		delete arg;
		ExitThread(0);
	}
	
	//get the right to read the list
	WaitForSingleObject(insert_mutex, INFINITE);

	// find the application
	MPI_Node *iter_node = mpi_list, *node = NULL;
	while (iter_node != NULL)
	{
		if (iter_node->id == dwID)
		{
			node = iter_node;
			break;
		}
		iter_node = iter_node->next;
	}
	

	//send over the list
	if (node)
	{

		while (SOCKET_ERROR == send(arg->sock, (char *)&node->nproc, sizeof(node->nproc), 0))
		{
			int error;
			char msg[256];
			error = WSAGetLastError();
			if (error == WSAEWOULDBLOCK)
			{
				Sleep(0);
				continue;		
			}
			translate_WSAErrorCode(error, msg);
			fdebug2("Socket Error dwID: %i, %s\n", error, msg);
			closesocket(arg->sock);
			WSACloseEvent(arg->sock_event);
			delete arg;
			ExitThread(0);
		}

		for (int i = 0; i < node->nproc; ++i)
		{

			WSAPROTOCOL_INFO ProtocolInfo;
			
			if (SOCKET_ERROR == WSADuplicateSocket(node->sockets[i], dwForeignProcID, &ProtocolInfo))
			{
				fdebug("Error in Duplicating the Socket\n");
				int	error = WSAGetLastError();
				char msg[256];
				translate_WSAErrorCode(error, msg);
				fdebug2("Socket Error dwID: %i, %s\n", error, msg);
			}
			
			while (SOCKET_ERROR == send(arg->sock, (char *)&ProtocolInfo, sizeof(WSAPROTOCOL_INFO), 0))
			{
				int error;
				char msg[256];
				error = WSAGetLastError();
				if (error == WSAEWOULDBLOCK)
				{
					Sleep(0);
					continue;		
				}
				translate_WSAErrorCode(error, msg);
				fdebug2("Socket Error dwID: %i, %s\n", error, msg);
				closesocket(arg->sock);
				WSACloseEvent(arg->sock_event);
				delete arg;
				ExitThread(0);
			}
		}
	}
	else
	{
		dwID =0;
		send(arg->sock, (char *)&dwID, sizeof(dwID), 0);
	}
	
	ReleaseMutex(insert_mutex);

}