📄 loginserver.cpp
字号:
// LoginServer.cpp: implementation of the LoginServer class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Wox2head.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
LoginServer::LoginServer()
{
sockinit();
now = 0;
FD_ZERO(&conn);
}
LoginServer::~LoginServer()
{
}
void LoginServer::sockinit()
{
int bcode; int on=1, off=0;
int len_connection_addr=sizeof (struct sockaddr_in);
WSADATA w;
if (WSAStartup(0x202, &w))
{
printf("\nWinsock 2.0 捞惑捞 鞘夸钦聪促(win95俊辑 诀单捞飘 鞘夸)...\n");
Gv->ServerON=0;
return;
}
sockfd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sockfd<0)
{
printf("\nERROR: 家南阑 父甸荐 绝嚼聪促\n");
printf("俊矾内靛 %i\n", WSAGetLastError());
Gv->ServerON=0;
return;
}
//setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
memset((char *) &Serv, 0, len_connection_addr);
Serv.sin_family=AF_INET;
Serv.sin_addr.s_addr=htonl(INADDR_ANY);
Serv.sin_port=htons(2011);
printf("Wox2Login: 肺变 辑滚 立加阑 扁促覆 [酒捞乔:%s:器飘:%d]\n",inet_ntoa(Serv.sin_addr),ntohs(Serv.sin_port));
bcode=bind(sockfd, (struct sockaddr *)&Serv, len_connection_addr);
if (bcode<0)
{
printf("\nERROR: 家南阑 官牢靛 且荐 绝家 - 俊矾内靛: %i\n",bcode);
Gv->ServerON = 0;
return;
}
listen(sockfd, 42);
}
void LoginServer::Disconnect(int s)
{
int j;
closesocket(client[s]);
for (j=s;j<now-1;j++)
{
client[j]=client[j+1];
}
now--;
printf("Wox2Login: 努扼捞攫飘[%d]狼 立加捞 谗绢脸嚼聪促.\n",s);
}
int LoginServer::Receive(int s, int x, int a)
{
int count;
if (a) count=0; // Just to get rid of warning message
do
{
count=recv(client[s], (char *)&buffer[s][recvcount], x-recvcount, 0);
memcpy((char *)&pack[s]+recvcount,(char *)&buffer[s][recvcount],x-recvcount);
if (count>0)
{
recvcount+=count;
}
}
while ((x!=2560)&&(x!=recvcount)&&(count>0));
return count;
}
void LoginServer::CheckMessage()
{
int s, i, oldnow;
FD_ZERO(&all);
FD_ZERO(&errsock);
nfds=0;
for (i=0;i<now;i++)
{
FD_SET(client[i],&all);
FD_SET(client[i],&errsock);
if (client[i]+1>nfds) nfds=client[i]+1;
if (server[i]>=0)
{
FD_SET(server[i],&all);
FD_SET(server[i],&errsock);
if (server[i]+1>nfds) nfds=server[i]+1;
}
}
s=select(nfds, &all, NULL, &errsock, &Ti->timeout);
if (s>0)
{
oldnow=now;
for (i=0;i<now;i++)
{
if (FD_ISSET(client[i],&errsock))
{
Disconnect(i);
}
if (server[i] >= 0) {
if (FD_ISSET(server[i],&errsock))
{
closesocket(server[i]);
// FailAuth(i);
}
}
if ((FD_ISSET(client[i],&all))&&(oldnow==now))
{
GetMsg(i);
// if (executebatch) batchcheck(i); //LB, bugfix (uncommenting this line) for server info
// not working and much more scripted things
// it's an odd place to do that check
// feel free to place it straticaly better,
// but DONT leave it out, that breaks a LOT !!!!
// (whoever commented it out, it took me hours to find it, grrr)
}
if (server[i] >= 0)
{
if ((FD_ISSET(server[i],&all))&&(oldnow==now))
{
// AuthTest(i);
}
}
}
}
}
void LoginServer::GetMsg(int s)
{
unsigned int i = 0;
int id_size = 0 ;
int pass_size = 0;
int email_size = 0;
char id[12] = "";
char pass[12] = "";
char email[30] = "";
int encs = 0;
char spr[] = "\xAA\x00\x11\x03\x8E\x55\x65\xD2\x27\x1B\x09\xB1\xCD\xBF\xAC\xB9\xCC\xB4\xCF\x00";
int len = sizeof(struct sockaddr);
int tempint;
recvcount=0;
if (Receive(s, 3, 0)>0)
{
if(!(buffer[s][0]=='\xAA'))
{
//printf( "沥惑楷搬捞 酒凑聪促");
Disconnect( s );
return;
}
int xt = Receive(s,2560,1);
switch( buffer[s][3] )
{
case '\x00':
fSend(s,"\xAA\x00\x07\x00\x00\x42\xF9\x1D\x63\x00");
break;
case '\x02': // 货肺窍扁 stuff
Xc->Dec_Pack(s,pack[s].mes);
id_size = Messages[s][0];
memcpy(id,Messages[s]+1,id_size);
pass_size = Messages[s][id_size+1];
memcpy(pass,Messages[s]+(id_size+2),pass_size);
i = 0;
while(!(i == Cc->acctcount))
{
if(!strcmp(acctx[i].name,id))
{
encs = Xc->Enc_Pack( s,"\x03\x8酒叼乐绢",0x0A,0x02,2);
break;
}
i++;
}
if(encs < 1 )
{
Gv->latest_acctcount[client[s]] = Cc->acctcount;
strcpy(acctx[Gv->latest_acctcount[client[s]]].name,id);
strcpy(acctx[Gv->latest_acctcount[client[s]]].pass,pass);
Cc->acctcount++;
Cc->charcount++;
Ci->itemcount++;
Ch->Bagcount++;
encs = Xc->Enc_Pack( s,"\x00\x00\x00\x00",4,0x02,2);
}
Cc->acctcount++;
Cc->charcount++;
send(client[s],Encrypted_Messages[s],encs,0);
break;
case '\x03':
Xc->Dec_Pack(s,pack[s].mes);
id_size = Messages[s][0];
memcpy(id,Messages[s]+1,id_size);
pass_size = Messages[s][id_size+1];
memcpy(pass,Messages[s]+(id_size+2),pass_size);
i = 0;
while(1)
{
if(!strcmp(acctx[i].name,id))
{
if(!strcmp(acctx[i].pass,pass))
{
if(acctx[i].login == true)
{
encs = Xc->Enc_Pack( s,"\x03\x0A捞固立加吝",12,0x02,2);
send(client[s],Encrypted_Messages[s],encs,0);
break;
}
fSend(s,"\xAA\x00\x05\x02\x04\x4A\x61\x7C");
spr[4] = lit(sed.serverip,1);
spr[5] = lit(sed.serverip,2);
spr[6] = lit(sed.serverip,3);
spr[7] = lit(sed.serverip,4);
if(Gv->sockopen1 == true)
{
spr[8] = '\x09';
spr[9] = '\xC5';
Gv->sockopen1 = false;
Gs->sockacc1 = i;
getpeername(client[s],(struct sockaddr *)&Gs->dummyServ1.sin_addr,&len);
}else if(Gv->sockopen2 == true)
{
spr[8] = '\x09';
spr[9] = '\xC6';
Gv->sockopen2 = false;
Gs->sockacc2 = i;
getpeername(client[s],(struct sockaddr *)&Gs->dummyServ2.sin_addr,&len);
}
spr[10] = id_size;
memcpy(spr+11,id,id_size);
send(client[s],spr,id_size+8+2+1,0);
acctx[i].login = true;
}
else
{
encs = Xc->Enc_Pack( s,"\x03\x08菩胶撇妨",10,0x02,2);
send(client[s],Encrypted_Messages[s],encs,0);
break;
}
}else if(i == Cc->acctcount)
{
encs = Xc->Enc_Pack( s,"\x03\x0A酒叼绝绢夸",12,0x02,2);
send(client[s],Encrypted_Messages[s],encs,0);
break;
}
i++;
}
break;
case '\x04'://货肺窍扁 2 stuff
Xc->Dec_Pack(s,pack[s].mes);
memset( (void *)&chr[Gv->latest_acctcount[client[s]]],0,sizeof(chr[Gv->latest_acctcount[client[s]]]));
chr[Gv->latest_acctcount[client[s]]].body = Messages[s][0];
chr[Gv->latest_acctcount[client[s]]].sex = Messages[s][2];
chr[Gv->latest_acctcount[client[s]]].country = Messages[s][1];
chr[Gv->latest_acctcount[client[s]]].sprit = Messages[s][3];
strcpy(chr[Gv->latest_acctcount[client[s]]].ClanName,"绝绢");
strcpy(chr[Gv->latest_acctcount[client[s]]].ClanTitle,"绝绢");
strcpy(chr[Gv->latest_acctcount[client[s]]].Title,"绝绢");
chr[Gv->latest_acctcount[client[s]]].Str = 3;
chr[Gv->latest_acctcount[client[s]]].Dex = 3;
chr[Gv->latest_acctcount[client[s]]].Int = 3;
tempint = Ti->Roll(10)+100;
chr[Gv->latest_acctcount[client[s]]].HitPoint = tempint;
chr[Gv->latest_acctcount[client[s]]].MaxHitPoint = tempint;
tempint = Ti->Roll(10)+100;
chr[Gv->latest_acctcount[client[s]]].ManaPoint = tempint;
chr[Gv->latest_acctcount[client[s]]].MaxManaPoint = tempint;
chr[Gv->latest_acctcount[client[s]]].Lv = 1;
chr[Gv->latest_acctcount[client[s]]].mapx = 10;
chr[Gv->latest_acctcount[client[s]]].mapy = 7;
chr[Gv->latest_acctcount[client[s]]].lastmap = 0;
chr[Gv->latest_acctcount[client[s]]].e_armo = 0xFF;
chr[Gv->latest_acctcount[client[s]]].e_block= 0xFF;
chr[Gv->latest_acctcount[client[s]]].e_helm = 0xFF;
chr[Gv->latest_acctcount[client[s]]].e_weap = 0xFF;
chr[Gv->latest_acctcount[client[s]]].e_etc1 = 0xFF;
chr[Gv->latest_acctcount[client[s]]].e_weap = 0xFF;
chr[Gv->latest_acctcount[client[s]]].Money = 0;
encs = Xc->Enc_Pack( s,"\x00\x0A捞绢窍扁秦",0x0C,0x02,2);
send(client[s],Encrypted_Messages[s],encs,0);
break;
case '\x10':
fSend(s,"\xAA\x00\x0C\x60\x00\x4E\x62\x95\x51\x91\x49\x6E\x6B\x46\x4F");
break;
case '\x4B':
break;
default:
FD_ZERO(&all);
FD_SET(client[s],&all);
nfds=client[s]+1;
if (select(nfds, &all, NULL, NULL, &Ti->timeout)>0)
{
Receive(s, 2560, 1);
}
printf("舅荐绝绰 皋矫瘤: 辨捞[%x] 疙飞[%x] 鞠龋拳[%x]\n", buffer[s][3], buffer[s][4],buffer[s][5] );
break;
}
}
else
{
Disconnect(s);
}
// memset((void*)&buffer[s],0,sizeof(buffer[s]));
}
void LoginServer::ConnReq()
{
int s; int len;
if (now<MAXCLIENT)
{
FD_ZERO(&conn);
FD_SET(sockfd, &conn);
nfds=sockfd+1;
s=select(nfds, &conn, NULL, NULL, &Ti->timeout);
if (s>0)
{
len=sizeof (struct sockaddr_in);
client[now]=accept(sockfd, (struct sockaddr *)&Serv, &len);
if (client[now]<0)
{
printf("ERROR: 努扼捞攫飘 楷搬俊 巩力啊 惯积!\n");
Gv->ServerON=0;
return;
}
server[now]=-1;
binlength[now]=0;
boutlength[now]=0;
struct sockaddr_in sock_addr_in;
getpeername(client[now],(struct sockaddr *)&sock_addr_in,&len);
printf("Wox2Login: Client %i [%s:%d] 楷搬沁嚼聪促 [醚:%i疙].\n",now,inet_ntoa(sock_addr_in.sin_addr),ntohs(sock_addr_in.sin_port),now+1);
printf("Wox2Login: Server %i [%s:%d] 促澜措扁 [醚:%i疙].\n",MAXCLIENT-now,inet_ntoa(Serv.sin_addr),ntohs(Serv.sin_port),now+1);
//connected to server
CK2[now] = 0;
fSend(now,"\xAA\x00\x13\x7E\x1B\x43\x4F\x4E\x4E\x45\x43\x54\x45\x44\x20\x53\x45\x52\x56\x45\x52\x0A");
now++;
return;
}
if (s<0)
{
printf("WoxServerList: Select (Conn) failed!\n");
Gv->ServerON=0;
return;
}
}
}
void LoginServer::SockClose () // Close all sockets for shutdown
{
int i;
closesocket(sockfd);
for (i=0;i<now;i++) closesocket(client[i]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -