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));
}







