1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| #include "includes.h"
DWORD WINAPI ls_Listen(LPVOID para) {
XServer::LoginServer *ls = (XServer::LoginServer *) para;
SOCKADDR_IN csin;
SOCKET csock;
int size = sizeof(csin);
int i = sizeof(int);
int j = sizeof(int);
int nbytes;
char buf[PACKET_SIZE];
Packet packet;
FD_ZERO(&ls->FD_Listen);
FD_SET(ls->sock, &ls->FD_Listen);
ls->FD_Max = ls->sock;
struct timeval tv;
tv.tv_sec = (time_t)0;
tv.tv_usec = (time_t)100;
for(;;) {
FD_ZERO(&ls->FD_tmp);
ls->FD_tmp = ls->FD_Listen;
if (select(ls->FD_Max+1, &ls->FD_tmp, NULL, NULL, &tv) < 0) {
cout << "ERROR: ls_Listen --> select() : " << WSAGetLastError() << endl;
break;
}
for(i = 0; i <= ls->FD_Max; ++i) {
if (FD_ISSET(i, &ls->FD_tmp)) {
if (i == ls->sock){
csock = accept(ls->sock, (SOCKADDR *) &csin, &size);
if(!ls->acceptingClients()) {
int a = CONNECT_REFUSED;
send(csock, (char*)&a, sizeof(int), 0);
shutdown(csock, 2);
}
else if(ls->getMaxClients() <= ls->nbClients()) {
int a = SERVER_FULL;
send(csock, (char*)&a, sizeof(int), 0);
shutdown(csock, 2);
}
else {
if(csock >= 0) {
FD_SET(csock, &ls->FD_Listen);
if(csock > ls->FD_Max) {
ls->FD_Max = csock;
}
printf("LoginServer: Client connection (IP: %s; Port: %d)\n", inet_ntoa(csin.sin_addr), ntohs(csin.sin_port));
Client *c = new Client((std::string)inet_ntoa(csin.sin_addr), (int)ntohs(csin.sin_port), csock);
/*//ls += c;
Packet *p = new Packet();
//p->setInfo(1, 0);
c->writePacket(p);
char buf[128];
sprintf_s(buf, "hey client %d", csock);
send(csock, buf, sizeof(buf), 0);*/
}
else {
cout << "shutdown" << endl;
shutdown(csock, 2);
}
}
}
else {
nbytes = recv(i, buf, sizeof(buf), 0);
if(nbytes > 0) {
buf[nbytes] = 0;
packet = Packet::Packet(*buf);
cout << "buf=" << buf << " (" << nbytes << ")" << endl;
ls->PacketHandler()->Push(packet);
}
else { //(nbytes <= 0)
printf("LoginServer: Client disconnection (i=%d) (%d)\n", i, WSAGetLastError());
shutdown(i, 2);
FD_CLR(i, &ls->FD_Listen);
}
}
}
}
}
cout << "INFO: LoginServer stopped listening." << endl;
CloseHandle(ls->thread);
return 0;
}
DWORD WINAPI pm_Parse(LPVOID packetManager) {
PacketManager *pm = (PacketManager *)packetManager;
Packet packet;
byte header;
for(;;) {
if(!pm->TODO()) {
cout << "INFO: No packets to parse, sleeping now 3 seconds." << endl;
Sleep(3000);
continue;
}
packet = pm->Read();
header = packet.read();
if(header > 0 && header <= 10) {
cout << "Packet is going to login" << endl;
// login -> ingame
}
else if(header <= 20) {
cout << "Packet is going to world" << endl;
// world
}
else {
cout << "Packet is going to channel" << endl;
// channel
}
}
return 0;
} |
Partager