



















by Jose Solares on Jun.01, 2005, under english, Linux
Note:This code expects to be using sockets blocking I/O request, to use non blocking I/O we should use libevent or a similar solution (like threads), this is outside of the scope of this code. It also assumes that we already have the server listening on a port and that we have already accepted a client connection `cliente_socket`. RCVBUFFER is 256.
char buffer[RCVBUFFER + 2]; buffer[RCVBUFFER] = 0; char response[] = {2,6,1,0,7,1,0,2,1,6,0x81}; int message_size,i,j; char counter = 0; if (( message_size = recv(client_socket, buffer, RCVBUFFER, 0)) < 0 ) err_handler ("recv() failed"); if ( message_size == 17 ) { if ( send(client_socket, response, 11, 0) != 11 ) err_handler ("send() failed"); } else { printf ( "- %d - \n", message_size ); err_handler ("Protocol Error"); } printf ("Starting...\n"); for (;;) { if (( message_size = recv(client_socket, buffer, RCVBUFFER, 0)) < 0 ) err_handler ("recv() failed"); if (message_size > 5 && bufer[0] == -128) counter = buffer[3]; i = (buffer[0] == -128)? 5 : 0; buffer[message_size + 1] = '\0'; buffer[message_size] = '\n'; //printf ("Capturing %d bytes\n",message_size); fprintf (stderr, "%s",&buffer[i]); //printf ("Current Counter : %d\n",counter); if (message_size == 1) { if (buffer[0] == 0x50) { char respond[] = {0x51}; if ( send (client_socket, respond, 1, 0) != 1) err_handler("send() failed"); } } else { i = message_size - 1; if (buffer[i-2] == 0x20 && buffer[i-1] == 0x0d && buffer[i] == 0x0a) { char respond[] = {0x40, 0x05, 0x01, ++counter, 0x81}; if ( send (client_socket, respond, 5, 0) != 5 ) err_handler("send() failed"); } } /* Do Something with the Data we received */ }
by Jose Solares on Jun.01, 2005, under Linux
char buffer[RCVBUFFER + 2];
buffer[RCVBUFFER] = 0;
char response[] = {2,6,1,0,7,1,0,2,1,6,0x81};
int message_size,i,j;
char counter = 0;
if (( message_size = recv(client_socket, buffer,
RCVBUFFER, 0)) < 0 )
err_handler ("recv() failed");
if ( message_size == 17 ) {
if ( send(client_socket, response, 11, 0) != 11 )
err_handler ("send() failed");
} else {
printf ( "- %d - \n", message_size );
err_handler ("Protocol Error");
}
printf ("Starting...\n");
for (;;) {
if (( message_size = recv(client_socket, buffer,
RCVBUFFER, 0)) < 0 )
err_handler ("recv() failed");
counter = ( buffer[0] == -128
&& message_size > 5 )? buffer[3] : counter;
i = (buffer[0] == -128)? 5 : 0;
buffer[message_size + 1] = '\0';
buffer[message_size] = '\n';
//printf ("Capturing %d bytes\n",message_size);
fprintf (stderr, "%s",&buffer[i]);
//printf ("Current Counter : %d\n",counter);
if (message_size == 1) {
if (buffer[0] == 0x50) {
char respond[] = {0x51};
if ( send (client_socket, respond, 1, 0) != 1)
err_handler("send() failed");
}
} else {
i = message_size - 1;
if (buffer[i-2] == 0x20 && buffer[i-1] == 0x0d &&
buffer[i] == 0x0a) {
char respond[] = {0x40, 0x05, 0x01, ++counter, 0x81};
if ( send (client_socket, respond, 5, 0) != 5 )
err_handler("send() failed");
}
}
/* Do Something with the Data we received */
}
by Jose Solares on Jun.01, 2005, under Linux
No encontre ninguna aplicación en linux que pudiera utilizar para un proyecto en el trabajo, por lo que armado de ethereal y RDTT en Windows hize una ingenieria reversa
Esta especificacion caracteriza a un Server de RDT ver codigo de ejemplo aca
Para iniciar una conexion el cliente de RDT nos envia un paquete de 17 bytes, para seguir recibiendo datos que el cliente nos enviara debemos responder con :
byte response[] = {2, 6, 1, 0, 7, 1, 0, 2, 1, 6, 0x81};
Luego recibimos los datos:
definimos un checksum que el cliente espera recibir de la siguiente manera :
( buffer[ 0 ] = = -128 && msize > 5 )?buffer[ 3 ]:0;
o
( buffer[ 0 ] = = 0x80 && msize > 5 )?buffer[ 3 ]:0;
dependiendo del OS que utilicemos.
buffer es char * donde recibimos la data con recv o read
msize es int donde tenemos la cantidad de bytes leidos
el checksum lo enviamos al cliente al recibir `200d0a` al final de un paquete utlizando una respuesta char[]
{0x40, 0x05, 0x01, ++checksum, 0x81};
RDT tiene algo similar al ping de IRC, periodicamente nos envia un paquete de 1 byte con 0x50, esperando que le enviemos un paquete de 1 byte con 0x51
Espero que les sirva esta información
Use the form below to search the site:
Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!
All entries, chronologically...