PHP Code:
void send_gnt(int sockfd, char *buff, int len)
{
while (len > 0)
{
int nSent = send(sockfd, buff, len, 0);
if (nSent > 0)
{
len -= nSent;
buff += nSent;
}
}
}
void player::send_instruction(int sockfd, char *sbuff, int size, int keyval)
{
char buffer[2];
pack(size, buffer);
char key[6] = "";
sprintf(key, "%05d", keyval);
crypt_comp(sbuff, size, 2);
crypt_xor(sbuff, key, size, 6, 2);
send_gnt(sockfd, buffer, 2);
send_gnt(sockfd, sbuff, size);
}
void player::receive_instruction()
{
// <-- start receive instruction
char buffer[1027];
int nRcvd = 0;
unsigned int iLen = 2;
bool gotLen = 0;
do
{
int rc = recv(get_sock(), &buffer[nRcvd], iLen, 0);
if (rc > 0)
{
nRcvd += rc;
if ((!gotLen) && (nRcvd > 1))
{
iLen = unpack(buffer[0], buffer[1]);
gotLen = true;
}
}
}
while ((!gotLen) || (nRcvd < iLen));
// end receive instruction -->
// <-- start process instruction
unsigned int value = unpack(buffer[2], buffer[3]);
char key[6] = "";
sprintf(key, "%05d", value);
crypt_comp(buffer, iLen + 2, 4);
crypt_xor(buffer, key, iLen + 2, 6, 4);
switch (value)
{
case(0): // instruction = create player
{
// code...
}
case(1):
{
// code...
}
case(2): // instruction = player chat
{
char a = buffer[4];
// <-- start copy message
string message;
char send[iLen - 2];
pack(2, send);
send[2] = a;
int i = 5;
char b = buffer[5];
while (b != '\0')
{
message += b;
send[i - 2] = b;
i++;
b = buffer[i];
}
// end copy message -->
if (a == 0x01)
{
// <-- start general chat
// - sent to all players
for (int i = 0; i < engine::playerVector.size(); i++)
{
cout << get_sock() << " - " << engine::playerVector[i]->get_sock() << endl;
send_instruction(engine::playerVector[i]->get_sock(), send, iLen - 2, 2);
}
}
else if (a == 0x02)
{
// <-- start whisper chat
// - sent only to one player
int pos = message.find(':', message.size());
string pname = message.substr(pos);
message.erase(0, pos);
// <-- start delete space
if (message[0] == ' ')
{
pname.erase(0, 1);
}
// end delete space -->
for (int i = 0; i < engine::playerVector.size(); i++)
{
if (engine::playerVector[i]->get_name() == pname)
{
send_instruction(engine::playerVector[i]->get_sock(), send, iLen - 2, 2);
send_instruction(get_sock(), send, iLen - 2, 2);
}
else
{
char p[2];
pack(2, p);
send_instruction(get_sock(), p, 2, 2);
}
}
}
else
{
char p[2];
pack(2, p);
send_instruction(get_sock(), p, 2, 2);
}
}
}
// end process message -->
}
exVal sock_send(double size, char *buff)
{
if (size > 1023)
{
return (0);
}
else
{
char buffer[2];
pack(static_cast<int>(size), buffer);
unsigned int keyval = unpack(buff[0], buff[1]);
char key[6] = "";
sprintf(key, "%05d", keyval);
crypt_comp(buff, static_cast<int>(size), 2);
crypt_xor(buff, key, static_cast<int>(size), 6, 2);
send_gnt(engine::esock.sock, buffer, 2);
send_gnt(engine::esock.sock, buff, static_cast<int>(size));
return (1);
}
}
void process_instruction(char *buffer, int iLen)
{
unsigned int value = unpack(buffer[2], buffer[3]);
char flag[6] = "";
sprintf(flag, "%05d", value);
crypt_comp(buffer, iLen + 2, 4);
crypt_xor(buffer, flag, iLen + 2, 6, 4);
switch (value)
{
case(0): // creation accept
case(1): // login request
{
char instruction[2];
instruction[0] = buffer[4];
instruction[1] = '\0';
strcat(engine::exbuff, flag);
strcat(engine::exbuff, instruction);
break;
}
case(2): // chat
{
char instruction[iLen - 4];
int i = 0;
while (i < iLen - 3)
{
instruction[0] = buffer[i + 4];
i++;
}
strcat(engine::exbuff, flag);
strcat(engine::exbuff, instruction);
break;
}
default: int i = 0; while (i == 0) {;}
}
}
exStr sock_receive()
{
engine::fdset = engine::fds;
engine::sr = select(1, &engine::fdset, NULL, NULL, &engine::selectTime);
if (engine::sr == 1)
{
if (FD_ISSET(engine::esock.sock, &engine::fdset))
{
char
buffer[1027] = "",
flag[6] = "";
int nRcvd = 0;
unsigned int iLen = 2;
bool gotLen = 0;
engine::exbuff[0] = '\0';
do
{
int rc = recv(engine::esock.sock, &buffer[nRcvd], iLen, 0);
if (rc > 0)
{
nRcvd += rc;
if ((!gotLen) && (nRcvd > 1))
{
iLen = unpack(buffer[0], buffer[1]);
gotLen = true;
}
}
else
{
if (rc == -1)
{
engine::sockRcvErr = -1;
}
if (rc == 0)
{
engine::sockRcvErr = 0;
}
}
}
while ((!gotLen) || (nRcvd < iLen));
engine::sockRcvErr = 0;
process_instruction(buffer, iLen);
return (engine::exbuff);
}
else
{
engine::sockRcvErr = 2;
}
}
else
{
engine::sockRcvErr = 3;
}
return ("");
}