void CStartServerWindow::OnBnClickedButton2()
{
	CString s;

	if(m_layoutlist.GetCurSel() < 0 || m_layoutlist.GetCurSel() > m_layoutlist.GetCount())
	{
		::AfxMessageBox(L"please select a layout!");
		return;
	}

	m_layoutlist.GetLBText(m_layoutlist.GetCurSel(), s);

	char* cs = KBEngine::strutil::wchar2char(s.GetBuffer(0));
	KBEUnordered_map< std::string, std::vector<CStartServerWindow::LAYOUT_ITEM> >::iterator iter = 
		layouts_.find(cs);

	free(cs);

	if(iter == layouts_.end())
	{
		::AfxMessageBox(L"please select a layout!");
		return;
	}

	std::vector<CStartServerWindow::LAYOUT_ITEM>::iterator iter1 = iter->second.begin();
	for(; iter1 != iter->second.end(); iter1++)
	{
		LAYOUT_ITEM& item = (*iter1);

		KBEngine::COMPONENT_TYPE ctype = KBEngine::ComponentName2ComponentType(item.componentName.c_str());

		std::vector<std::string> vec;
		KBEngine::strutil::kbe_split(item.addr, ':', vec);
		if(vec.size() != 2)
		{
			continue;
		}

		KBEngine::Network::EndPoint* endpoint = new KBEngine::Network::EndPoint();
		
		KBEngine::u_int32_t address;
		endpoint->convertAddress(vec[0].c_str(), address);
		KBEngine::Network::Address addr(address, htons(atoi(vec[1].c_str())));

		if(addr.ip == 0)
		{
			::AfxMessageBox(L"address is error!");
			delete endpoint;
			continue;
		}

		endpoint->socket(SOCK_STREAM);
		if (!endpoint->good())
		{
			AfxMessageBox(L"couldn't create a socket\n");
			delete endpoint;
			continue;
		}

		endpoint->addr(addr);
		if(endpoint->connect(addr.port, addr.ip) == -1)
		{
			CString err;
			err.Format(L"connect server is error! %d", ::WSAGetLastError());
			AfxMessageBox(err);
			delete endpoint;
			continue;
		}
		
		endpoint->setnonblocking(true);

		KBEngine::Network::Bundle bundle;
		bundle.newMessage(KBEngine::MachineInterface::startserver);
		bundle << KBEngine::getUserUID();
		bundle << ctype;
		KBEngine::Network::Channel::send(*endpoint, &bundle);
		KBEngine::Network::TCPPacket packet;
		packet.resize(1024);

		fd_set	fds;
		struct timeval tv = { 0, 1000000 }; // 1000ms

		FD_ZERO( &fds );
		FD_SET((int)(*endpoint), &fds);
		
		int selgot = select((*endpoint)+1, &fds, NULL, NULL, &tv);
		if(selgot == 0)
		{
			delete endpoint;
			continue;	// 超时可能对方繁忙
		}
		else if(selgot == -1)
		{
			delete endpoint;
			continue;
		}
		else
		{
			endpoint->recv(packet.data(), 1024);
		}

		bool success = true;
		packet << success;

		if(success)
		{
			for(int row = 0; row < m_list.GetItemCount(); row++)
			{
				CString name = m_list.GetItemText(row, 0);
				CString addr = m_list.GetItemText(row, 1); 
				CString running = m_list.GetItemText(row, 2); 

				char* cs1 = KBEngine::strutil::wchar2char(name.GetBuffer(0));
				char* cs2 = KBEngine::strutil::wchar2char(addr.GetBuffer(0));

				if(item.componentName == cs1 && item.addr == cs2 && running == L"false")
				{
					free(cs1);
					free(cs2);
					m_list.SetItemText(row, 2, L"true");
					break;
				}

				free(cs1);
				free(cs2);
			}
		}

		delete endpoint;
	}
}
void CConnectRemoteMachineWindow::OnBnClickedOk()
{
	// TODO: Add your control notification handler code here
	CguiconsoleDlg* dlg = static_cast<CguiconsoleDlg*>(theApp.m_pMainWnd);
	byte ips[4];

	if (0 == m_ip.GetAddress(ips[0],ips[1],ips[2],ips[3]))
	{
		AfxMessageBox(L"address is error!");
		return;
	}
	
	char strip[256];
	sprintf_s(strip, 256, "%d.%d.%d.%d", ips[0],ips[1],ips[2],ips[3]);
	
	KBEngine::u_int16_t port = 0;
	CString sport;
	m_port.GetWindowTextW(sport);
	char* csport = KBEngine::strutil::wchar2char(sport.GetBuffer(0));
	port = atoi(csport);
	std::string command = strip;
	command += ":";
	command += csport;
	free(csport);

	KBEngine::Network::EndPoint* endpoint = KBEngine::Network::EndPoint::ObjPool().createObject();

	KBEngine::u_int32_t address;
	Network::Address::string2ip(strip, address);
	KBEngine::Network::Address addr(address, htons(port));

	if(addr.ip == 0)
	{
		::AfxMessageBox(L"address is error!");
		KBEngine::Network::EndPoint::ObjPool().reclaimObject(endpoint);
		return;
	}

	endpoint->socket(SOCK_STREAM);
	if (!endpoint->good())
	{
		AfxMessageBox(L"couldn't create a socket\n");
		KBEngine::Network::EndPoint::ObjPool().reclaimObject(endpoint);
		return;
	}

	endpoint->addr(addr);
	if(endpoint->connect(addr.port, addr.ip) == -1)
	{
		CString err;
		err.Format(L"connect server is error! %d", ::WSAGetLastError());
		AfxMessageBox(err);
		KBEngine::Network::EndPoint::ObjPool().reclaimObject(endpoint);
		return;
	}

	endpoint->setnonblocking(false);
	int8 findComponentTypes[] = {LOGGER_TYPE, BASEAPP_TYPE, CELLAPP_TYPE, BASEAPPMGR_TYPE, CELLAPPMGR_TYPE, LOGINAPP_TYPE, DBMGR_TYPE, BOTS_TYPE, UNKNOWN_COMPONENT_TYPE};
	int ifind = 0;

	while(true)
	{
		int8 findComponentType = findComponentTypes[ifind++];
		if(findComponentType == UNKNOWN_COMPONENT_TYPE)
		{
			//INFO_MSG("Componentbridge::process: not found %s, try again...\n",
			//	COMPONENT_NAME_EX(findComponentType));
			break;
		}

		KBEngine::Network::Bundle bhandler;
		bhandler.newMessage(KBEngine::MachineInterface::onFindInterfaceAddr);

		KBEngine::MachineInterface::onFindInterfaceAddrArgs7::staticAddToBundle(bhandler, KBEngine::getUserUID(), KBEngine::getUsername(), 
			CONSOLE_TYPE, g_componentID, (COMPONENT_TYPE)findComponentType, 0, 0);

		endpoint->send(&bhandler);

		KBEngine::Network::TCPPacket packet;
		packet.resize(65535);

		endpoint->setnonblocking(true);
		KBEngine::sleep(300);
		packet.wpos(endpoint->recv(packet.data(), 65535));

		while(packet.length() > 0)
		{
			MachineInterface::onBroadcastInterfaceArgs24 args;
			
			try
			{
				args.createFromStream(packet);
			}catch(MemoryStreamException &)
			{
				goto END;
			}

			INFO_MSG(fmt::format("CConnectRemoteMachineWindow::OnBnClickedOk: found {}, addr:{}:{}\n",
				COMPONENT_NAME_EX((COMPONENT_TYPE)args.componentType), inet_ntoa((struct in_addr&)args.intaddr), ntohs(args.intport)));

			Components::getSingleton().addComponent(args.uid, args.username.c_str(), 
				(KBEngine::COMPONENT_TYPE)args.componentType, args.componentID, args.globalorderid, args.grouporderid, 
				args.intaddr, args.intport, args.extaddr, args.extport, args.extaddrEx, args.pid, args.cpu, args.mem, args.usedmem, 
				args.extradata, args.extradata1, args.extradata2, args.extradata3);

		}
	}
END:
	dlg->updateTree();

	KBEngine::Network::EndPoint::ObjPool().reclaimObject(endpoint);
	wchar_t* wcommand = KBEngine::strutil::char2wchar(command.c_str());
	bool found = false;
	std::deque<CString>::iterator iter = m_historyCommand.begin();
	for(; iter != m_historyCommand.end(); iter++)
	{
		if((*iter) == wcommand)
		{
			found = true;
			break;
		}
	}
	
	if(!found)
	{
		m_historyCommand.push_front(wcommand);
		if(m_historyCommand.size() > 10)
			m_historyCommand.pop_back();

		saveHistory();
	}

	free(wcommand);

	OnOK(); 
}