Práctico 3, problema 1, patrón de lectura en client.receive() en API 0.2

Práctico 3, problema 1, patrón de lectura en client.receive() en API 0.2

de Gustavo Paulo Mazeikis Alba -
Número de respuestas: 5

En la cartilla de sockets (API 0.2) se detalla la función client.receive(), para leer de un socket.

Viendo que la cartilla está inspirada en LuaSocket (http://w3.impa.br/~diego/software/luasocket/tcp.html), consulto si se puede usar esa versión de la función, ya que permite especificar un patrón de lectura.

En el ejercicio 1 se pide implementar la lectura de líneas (bloqueante y no bloqueante), lo cual con el patrón '*l' , se simplifica bastante.

Muchas gracias.

En respuesta a Gustavo Paulo Mazeikis Alba

Re: Práctico 3, problema 1, patrón de lectura en client.receive() en API 0.2

de Jorge Visca -

No, la idea es justamente implementar esa funcionalidad a partir de las primitivas básicas de sockets. (Pero efectivamente, lo que van a implementar es muy parecido a lo que hay realmente implementado adentro de la biblioteca que mencionas).

En respuesta a Jorge Visca

Re: Práctico 3, problema 1, patrón de lectura en client.receive() en API 0.2

de Sergio Leandro Carrasco Sanguinetti -

¿Alguna idea de como encarar esto usando el API de la cartilla?

Esto es lo que se especifica para el receive en Luassocket:

  • '*a': reads from the socket until the connection is closed. No end-of-line translation is performed;
  • '*l': reads a line of text from the socket. The line is terminated by a LF character (ASCII 10), optionally preceded by a CR character (ASCII 13). The CR and LF characters are not included in the returned line. In fact, all CR characters are ignored by the pattern. This is the default pattern;
  • number: causes the method to read a specified number of bytes from the socket.
Ahora bien en el receive de la cartilla, cual seria el comportamiento?

Gracias



En respuesta a Sergio Leandro Carrasco Sanguinetti

Re: Práctico 3, problema 1, patrón de lectura en client.receive() en API 0.2

de Jorge Visca -

Tenes que implementar un equivalente a receive('*l'), teniendo solo disponible la llamada receive() de la cartilla. Para esto deberás ir almacenando el resultado de llamadas sucesivas de receive() en un buffer, y devolver únicamente cuando hayas recibido una línea completa.

El usuario lo que quiere es poder invocar read_line() y estar seguro de recibir una linea completa. Llamadas sucesivas a read_line() deben devolver todas las lineas enviadas.

PS: había un typo en la letra del práctico y lo subimos de nuevo: el ejemplo de stream es "line1\nline2\n"


En respuesta a Jorge Visca

Re: Práctico 3, problema 1, patrón de lectura en client.receive() en API 0.2

de Sergio Leandro Carrasco Sanguinetti -

Para la opción BLOQUEANTE. Suponiendo que la operación read_line se implementa a nivel del propio socket: ¿La idea es que el socket mantenga la parte no devuelta (lo que viene luego del \n) entre llamadas?

Ejemplo:

El contexto es el siguiente: se nos envía este string "Hola, que tal?\ncómo estas?\n"Al llamar por primera vez a read_line hay que devolver "Hola, que tal?" y la segunda vez que se llama "cómo estas?"

Suponiendo que se nos envía el string mencionado en dos partes: "Hola, que tal?\ncómo" y "estas?\n" (eso es lo que devolverían dos lecturas sucesivas con socket.receive()), la primera vez que llamamos a read_line el receive retorna esto: "Hola, que tal?\ncómo" y habría que devolver "Hola, que tal?". Si no guardamos en el socket el "cómo", la próxima vez que llamemos a read_line, estaríamos retornando "estas?" y no "cómo estas?" (ya que la parte del "cómo" ya fue consumida del buffer).

Era la idea de este ejercicio tomar en cuenta esto? 


Para la opción NO BLOQUEANTE. Misma cuestión ya descrita y aparte ¿que se debe retornar si al llamar al receive este nos  retorna "Hola, que"? ¿También habría que guardar en el socket lo leído pero no devuelto, no? ya que en esta opción como es no bloqueante no tiene una iteración esperando hasta leer un '\n'.






En respuesta a Sergio Leandro Carrasco Sanguinetti

Re: Práctico 3, problema 1, patrón de lectura en client.receive() en API 0.2

de Jorge Visca -

Efectivamente, la llamada debe funcionar sin pérdida de información. Absolutamente todo lo que un extremo envió el otro deberá recibirlo (por algo usamos TCP). Para eso probablemente debas guardar el "resto" que todavía se pudo entregar en alguna parte, como una variable global.