12.08.2016, 00:11
(
Последний раз редактировалось Zume; 12.08.2016 в 03:17.
)
Sн es posible, lo ъnico es que tienes que buscar una forma de comunicar el programa con el servidor, por ejemplo, tъ abres el server (SA:MP, realmente) entonces podrбs escuchar supongamos el puerto 9232 (digamos que se te ocurre hacerlo con algъn programa externo o interno de sockets), el cual contestarб el cliente (el .exe) y asн podrнas operar incluso las iptables para agregar lista blanca en caso de que se envнe la peticiуn.
Atenciуn que este mйtodo no es el mбs efectivo, sobre todo porque alguien fбcilmente podrнa falsificar la peticiуn y con ingenierнa inversa conocer el mensaje de lectura y procesamiento, por lo que lo mбs factible si usas un caso como este es crear un HASH que sуlo tъ sepas, o un hash que se sincronice con datos aleatorios del servidor.
Por ejemplo, este es un cliente en python bastante basico:
utilizando el mecanismo del query (en tu caso podrias usar otro o hacer uno tu mismo) pude recibir informacion del servidor atraves de sockets por el protocolo udp:
Paquete 'i';

Paquete 'c':

obviamente esto es solamente un script de prueba.
AGREGO
Una conexion simple de cliente - servidor podria ser esta.
El servidor se inicia .. en escucha a un puerto UDP.

Viene el cliente y se conecta, e intenta ver si el server esta ON haciendo ping por udp

Viene el servidor y recibe la peticion, entonces le dice al cliente que puede entrar (aca le aplicas los valores de comprobacion, haces algun tipo de sistema firewall o algo que ponga OFF el server para todos, muestre ON el server o asigne alguna variable o callback ya adaptandolo a forma de plugin)

Ya fuera de todo viene el cliente y sabe que le aceptaste la conexion:

El codigo utilizado para esta muestra fue el siguiente:
Cliente:
Server:
como te dije, es una forma, hay muchas mas sin embargo podrias aprovechar la rapidez del udp y la adaptabilidad en SA:MP, como uno de los unicos problemas tendriamos la vulnerabilidad del protocolo
Atenciуn que este mйtodo no es el mбs efectivo, sobre todo porque alguien fбcilmente podrнa falsificar la peticiуn y con ingenierнa inversa conocer el mensaje de lectura y procesamiento, por lo que lo mбs factible si usas un caso como este es crear un HASH que sуlo tъ sepas, o un hash que se sincronice con datos aleatorios del servidor.
Por ejemplo, este es un cliente en python bastante basico:
PHP код:
import time
from socket import *
# DATOS DEL SERVER
servidor = '83.222.116.222:1111';
partir_ip = servidor.split(':');
ip = str(partir_ip[0]);
puerto = int(partir_ip[1]);
socket = socket(AF_INET, SOCK_DGRAM);
socket.settimeout(1);
socket.sendto('Comprobando estado del servidor .. ', (ip, puerto))
try:
pack = '';
pack += 'SAMP';
spl = ip.split('.');
pack += chr(int(spl[0]));
pack += chr(int(spl[1]));
pack += chr(int(spl[2]));
pack += chr(int(spl[3]));
pack += chr(puerto & 0xFF);
pack += chr(puerto >> 8 & 0xFF);
pack += 'c';
socket.sendto(bytes(pack), (ip, puerto))
respuesta = socket.recv(1024);
print respuesta;
# Recive la informacion del server y aca puedes aprovechar un
# code de solicitud que luego aceptaras desde el server
# y como te digo, un hash de conexion para evitar conexiones fakes
except timeout:
print 'REQUEST TIMED OUT';
socket.close();
Paquete 'i';

Paquete 'c':

obviamente esto es solamente un script de prueba.
AGREGO
Una conexion simple de cliente - servidor podria ser esta.
El servidor se inicia .. en escucha a un puerto UDP.

Viene el cliente y se conecta, e intenta ver si el server esta ON haciendo ping por udp

Viene el servidor y recibe la peticion, entonces le dice al cliente que puede entrar (aca le aplicas los valores de comprobacion, haces algun tipo de sistema firewall o algo que ponga OFF el server para todos, muestre ON el server o asigne alguna variable o callback ya adaptandolo a forma de plugin)

Ya fuera de todo viene el cliente y sabe que le aceptaste la conexion:

El codigo utilizado para esta muestra fue el siguiente:
Cliente:
PHP код:
from socket import *
import sys;
import urllib2;
# DATOS DEL SERVER
servidor = '127.0.0.1:4225';
partir_ip = servidor.split(':');
ip = str(partir_ip[0]);
puerto = int(partir_ip[1]);
def getMyIP():
ret = urllib2.urlopen('https://enabledns.com/ip');
return ret.read();
def Main():
# OBTENEMOS IP DEL SOLICITANTE
solicitante = getMyIP();
sock = socket(AF_INET, SOCK_DGRAM);
sock.settimeout(10);
while 1:
sock.sendto("('PING', '%s'): Entro al servidor!" % solicitante, (ip, puerto))
print 'Intentando conectar a %s' % servidor;
try:
sock.sendto("('REQUEST', '%s'): Puedo entrar?" % solicitante, (ip, puerto))
respuesta = sock.recvfrom(1024);
respuesta = respuesta[0];
if respuesta == 'OK':
print 'El servidor te ha aceptado la peticion!';
else:
print 'El servidor te ha rechazado la peticion.';
break;
except timeout:
print 'REQUEST TIMED OUT';
break;
sock.close();
sys.exit();
Main();
PHP код:
import re;
import socket;
import sys;
UDP_IP = "127.0.0.1"
UDP_PORT = 4225;
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
print 'Iniciando servidor ..';
try:
sock.bind((UDP_IP, UDP_PORT))
except socket.error as msg:
print 'El enlace ha fallado. Error: ' + str(msg[0]) + ' Mensaje: ' + msg[1]
sys.exit(); # Cerrar aplicacion;
print 'Servidor iniciado, escuchando en ' + UDP_IP + ':' + str(UDP_PORT);
while 1:
data, addr = sock.recvfrom(1024);
if(data != ""):
req = re.compile("\('([^']+)', '([^']+)'\)").findall(data);
gen = req[0];
ip = gen[1];
solicitud = gen[0];
if solicitud == 'REQUEST':
entrante = addr[0] + ':' + str(addr[1]);
print '%s te envia una peticion de entrada' % entrante;
# Puedes buscar alguna forma de comprobar y ver que la IP cumpla tus requisitos, etc
sock.sendto("OK", (addr[0], addr[1])); # LE DECIMOS OKEY
print 'Aceptaste a %s en tu servidor.' % entrante;
elif solicitud == 'PING':
print 'Vale, que quieres?';
sock.close();