[Modulo] Sockets 3.
Es una modificación del modulo sockets_hz,que a su vez es una modificación del modulo sockets1.
Code:
/* Opens a new connection to hostname:port via protocol (either SOCKET_TCP or SOCKET_UDP),
* returns a socket (positive) or negative or zero on error.
* States of error:
* 0 - no error
* 1 - error while creating socket
* 2 - couldn't resolve hostname
* 3 - couldn't connect to given hostname:port
*/
native socket_open(const _hostname[], _port, _protocol = SOCKET_TCP, &_error);
/* Opens a new listenning connection bind to hostname:port via protocol (either SOCKET_TCP or SOCKET_UDP),
* returns a socket (positive) or negative or zero on error.
* States of error:
* 0 - no error
* 1 - error while creating socket
* 2 - couldn't resolve hostname
* 3 - couldn't connect to given hostname:port
*/
native socket_listen(const _hostname[], _port, _protocol = SOCKET_TCP, &_error);
/* Closes a Socket */
native socket_close(_socket);
/* Accept a connection on a listenning socket
* returns a socket (positive) or negative or zero on error. */
native socket_accept(_socket);
/* Set a socket in unblocking mode */
native socket_unblock(_socket);
/* Recieves Data to string with the given length */
native socket_recv(_socket, _data[], _length);
/* Sends data to the Socket */
native socket_send(_socket, const _data[]);
/* Same as socket_send but Data can contain null bytes */
native socket_send2(_socket, const _data[], _length);
/* This function will return true if the state (buffer content) have changed within the last recieve or
* the timeout, where timeout is a value in µSeconds, (1 sec =1000000 µsec).
* Use to check if new data is in your socket. */
native socket_change(_socket, _timeout=100000);
// Nuevo! ===================================================
/* Recieves Data to string with the given length */
native socket_recvfrom(_socket, _data[], _len, &_port, _ip[], _iplen);
/* Sends data to specific server */
native socket_sendto(_socket, _data[], _ip[], _port);
Ejemplos:
Servidor:
PHP Code:
#include <amxmodx>
#include <sockets3>
#define MMO_SERVER "127.0.0.1"
#define MMO_PORT 30015
new g_socket
public plugin_init()
{
new error
g_socket = socket_listen(MMO_SERVER, MMO_PORT, SOCKET_UDP, error)
if(!g_socket || error )
{
set_fail_state("Error listen socket")
return
}
socket_unblock(g_socket)
set_task(1.0, "test", flags="b")
}
public test()
{
if(!socket_change(g_socket, 0)) return
static data[20], ip[25], port
data[0] = 0
socket_recvfrom(g_socket, data, charsmax(data), port, ip, 24)
if(!data[0]) return
new result = socket_sendto(g_socket, data, ip, port) // Le respondemos al cliente
server_print("data: [%s] - ip:[%s] - port:[%d] - result: [%d]", data, ip, port, result)
}
Cliente:
PHP Code:
#include <amxmodx>
#include <sockets> // Para el cliente es suficiente con el modulo viejo
#define MMO_SERVER "127.0.0.1"
#define MMO_PORT 30015
new g_socket
public plugin_init()
{
new error
g_socket = socket_open(MMO_SERVER, MMO_PORT, SOCKET_UDP, error)
if(!g_socket || error )
{
set_fail_state("Error open socket")
return
}
set_task(1.0, "test", flags="b")
}
public test()
{
socket_send(g_socket, "eco")
if(!socket_change(g_socket, 0)) return
static data[20]
socket_recv(g_socket, data, charsmax(data))
if(!data[0]) return
server_print("Respuesta: %s", data)
}
NOTA: socket_send en el include (modulo sockets1/sockets_hz) tiene tres parámetros,pero el ultimo no se usa,pueden dejar la native asi:
PHP Code:
/* Sends data to the Socket */
native socket_send(_socket, const _data[]);