Ayuda con servidor
#7

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:

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_INETSOCK_DGRAM);
socket.settimeout(1);
 
socket.sendto('Comprobando estado del servidor .. ', (ippuerto))
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 >> 0xFF);
    
pack += 'c';
        
    
socket.sendto(bytes(pack), (ippuerto))
    
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(); 
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:

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_INETSOCK_DGRAM);
    
sock.settimeout(10);
    while 
1:
        
sock.sendto("('PING', '%s'): Entro al servidor!" solicitante, (ippuerto))
        print 
'Intentando conectar a %s' servidor;
        
        try:
            
sock.sendto("('REQUEST', '%s'): Puedo entrar?" solicitante, (ippuerto))
            
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(); 
Server:

PHP код:
import re;
import socket;
import sys;
UDP_IP "127.0.0.1"
UDP_PORT 4225;
sock socket.socket(socket.AF_INETsocket.SOCK_DGRAM);
sock.setsockopt(socket.SOL_SOCKETsocket.SO_REUSEADDR1)
print 
'Iniciando servidor ..';
try:
    
sock.bind((UDP_IPUDP_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:
    
dataaddr 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(); 
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
Reply


Messages In This Thread
Ayuda con servidor - by edgar4454 - 09.08.2016, 21:51
Re: Ayuda con servidor - by [CG]Milito - 09.08.2016, 23:51
Respuesta: Ayuda con servidor - by Goncho28 - 10.08.2016, 01:17
Re: Ayuda con servidor - by jhgr16 - 10.08.2016, 04:09
Re: Ayuda con servidor - by Choidito - 11.08.2016, 00:00
Re: Ayuda con servidor - by JeffLiiz - 11.08.2016, 16:34
Respuesta: Ayuda con servidor - by Zume - 12.08.2016, 00:11

Forum Jump:


Users browsing this thread: 4 Guest(s)