[PROBLEM] Metin2 Server State

12/26/2009 20:26 tim66613#1
Hallo,

Mein Clientless-Bot soll beim Serverselect auch die jeweiligen Channels und ihre States anzeigen. (STATES=...,NORM,BUSY,FULL).
Wenn ich den folgenden Code benutze, bekomme ich bei allen Channels STATE_NORM zurück, obwohl dieselben im Metin2-Client als BUSY angezeigt werden. Ich hoffe jemand kann mir helfen.

MfG tim.

EDIT: Problem gefunden & gelöst!.

Code:
/* ServerStateChecker implementation */

void NetworkStream::ServerStateChecker::Create(uint16_t port)
{
	m_socket = socket(AF_INET, SOCK_DGRAM, 0);
	m_sig = 0;

	if(m_socket != -1) {
		u_long argp = 1;

		m_addr.sin_family = AF_INET;
		m_addr.sin_addr.s_addr = 0;
		m_addr.sin_port = htons((u_short)port);

		ioctlsocket(m_socket, FIONBIO, &argp);

		if(bind(m_socket, (sockaddr*)&m_addr, sizeof(sockaddr_in)) == -1)
			throw _("NetworkStream::ServerStateChecker::Create(): Unable to bind sockaddr_in to socket.");
	}else
		throw _("NetworkStream::ServerStateChecker::Create(): Unable to create socket.");
}

void NetworkStream::ServerStateChecker::Destroy()
{
	if(m_socket != -1)
		closesocket(m_socket);

	m_addr.sin_addr.s_addr = 0;
}

int NetworkStream::ServerStateChecker::Update()
{
	if(m_socket == -1)
		throw _("NetworkStream::ServerStateChecker::Update(): Not initialized.");

	char buf[10];
	bool isRetry = false;
	int len, size = sizeof(sockaddr_in);

check_for_state:
	if((len = recvfrom(m_socket, buf, 10, 0, (sockaddr*)&m_addr, &size)) == 10) {
		if(buf[0] > 3 || buf[1] != m_sig)
			throw _("NetworkStream::ServerStateChecker::Update(): invalid server state.");

		return buf[0];
	}else{
		if(WSAGetLastError() == WSAEWOULDBLOCK) {
			if(isRetry == false) {
				Sleep(250);
				isRetry = true;
				goto check_for_state;
			}

			// Unable to get server state.
			return 0;
		}

		throw _("NetworkStream::ServerStateChecker::Update(): packet size is wrong.");
	}
}

void NetworkStream::ServerStateChecker::Request(int key, const char* ip, uint16_t port)
{
	if(m_socket == -1)
		throw _("NetworkStream::ServerStateChecker::Request(): Not initialized.");

	m_addr.sin_addr = GetInetAddress(ip);
	m_addr.sin_port = htons((u_short)port);

	char buf[9];

	buf[0] = 1; // Packet Type: kGetServerState
	buf[1] = m_sig;
	buf[2] = m_sig >> 8;
	buf[3] = m_sig >> 16;
	buf[4] = m_sig >> 24;
	buf[5] = key;
	buf[6] = key >> 8;
	buf[7] = key >> 16;
	buf[8] = key >> 24;

	sendto(m_socket, buf, 9, 0, (sockaddr*)&m_addr, sizeof(sockaddr_in));
}
12/13/2010 18:36 Checka96#2
Danke, jetzt komm ich weiter ^^
04/14/2011 15:26 useluker#3
where to put this text?
11/21/2011 19:43 Orban#4
Könntest du den mal bitte uploaden oder nur einen clientless einlogger :D