PHP Code:
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
bool isValidNumber(const char *charnum, int **number)
{
int i, num = 0;
if(charnum == NULL)
{
return 0;
}
for(i = 0; i < strlen(charnum); i++)
{
if(charnum[i] >= '0' && charnum[i] <= '9')
{
num += pow(10.0, (int)(strlen(charnum) - i - 1)) * (charnum[i] - '0');
}
else
{
return 0;
}
}
*number = (int *)num;
return 1;
}
bool isValidRange(const char *range)
{
int *num;
if(!isValidNumber(range, &num))
{
return 0;
}
if((int)num >= 0 && (int)num <= 255)
{
return 1;
}
return 0;
}
int isValidAddress(const char *ip)
{
int i, dots = 0;
char *token;
for(i = 0; i < strlen(ip); i++)
{
if(ip[i] == '.')
dots++;
}
if(dots != 3)
{
return 0;
}
for(i = 0; i < dots + 1; i++)
{
if(i == 0)
{
token = strtok(strdup(ip), ".");
}
else
{
token = strtok(NULL, ".");
}
if(!isValidRange(token))
{
return 0;
}
}
return 1;
}
char* sendCommand(char *ip, int port, char *message)
{
int Socket;
struct sockaddr_in server;
struct timeval timeout;
int i;
char *data;
char *fixed;
char response[16384];
data = strcat(strdup("00000"), message);
for(i = 0; i < 4; i++)
{
data[i] = 0xFF;
}
data[i] = 0x02;
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = inet_addr(ip);
timeout.tv_sec = 2;
timeout.tv_usec = 2;
Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(Socket == -1)
{
return "0";
}
if(setsockopt(Socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) == -1)
{
close(Socket);
return "0";
}
if(setsockopt(Socket, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) == -1)
{
close(Socket);
return "0";
}
if(connect(Socket, (struct sockaddr *)&server, sizeof(server)) == -1)
{
close(Socket);
return "0";
}
sendto(Socket, data, strlen(data), 0, (struct sockaddr *)&server, sizeof(server));
i = recvfrom(Socket, response, sizeof(response), 0, 0, 0);
if(i == -1)
{
close(Socket);
return "0";
}
response[i] = '\0';
close(Socket);
fixed = strtok(response, "\\");
fixed = strtok(NULL, "\0");
for(i = 0; i < strlen(fixed); i++)
{
if(fixed[i] == '\n')
{
fixed[i] = '\t';
}
if(fixed[i] == '"')
{
fixed[i] = '\t';
}
if(fixed[i] == '\\')
{
fixed[i] = '\t';
}
}
return fixed;
}
void gsc_utils_sendCommand()
{
char *ip;
char *data;
int port = 0;
if(!stackGetParams((char *)"sis", &ip, &port, &data) || strlen(ip) == 0 || port == 0 || strlen(data) == 0) {
stackPushUndefined();
return;
}
if(isValidAddress(ip))
stackPushString(sendCommand(ip, port, data));
else
stackPushInt(0);
}
PHP Code:
resp = sendCommand("185.58.205.123", 28960, "getstatus");
array = StrTok(resp, "\t");
for (i=0;i<array.size;i++)
{
printfline("[%]: %", i, array[i]);
}
Works:
But not sure about stability since i only done a quick-test, you may go ahead and improve this code if you need this