es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Modificando el búfer subyacente de open_memstream.

Estoy implementando un servidor HTTP en el que recibo bytes hasta \r\n\r\n y los guardo en un stream:

    char *requestbuffer;
    sizet requestbytes = 0, recvbytes;
    FILE *requeststream = openmemstream(&requestbuffer, &requestbytes);

bool headers_received = false;

while (!headers_received) {
    char buf[BUFSIZ] = {0};
    recv_bytes = recv(client_socketfd, buf, BUFSIZ - 1, NULL);
    if (recv_bytes == -1) {
        perror("recv");
        continue;
    } else if (recv_bytes == 0) {
        printf("Connection closed\n");
        break;
    }
    fprintf(request_stream, "%s", buf);
    if (strstr(buf, "\r\n\r\n") != NULL)
        headers_received = true;
}

Ahora, necesito mantener el stream abierto para recibir más solicitudes del mismo cliente (HTTP/1.1 pipelining). Sin embargo, también necesito analizar las cabeceras recibidas. Entonces, tengo dos opciones:

O bien, copiar request_buffer y luego analizarlo por piezas:

   char request[requestbytes + 1];
   fread(request, sizeof (char), requestbytes, requeststream);
   request[requestbytes] = '\0';
   char *requestsaveptr, *linesaveptr, *line;
   line = strtokr(request, "\r\n", &requestsaveptr);
   char *method = strtokr(line, " ", &linesaveptr);
   if (strcmp(method, "GET") == 0) {
//.. seguir analizando

O analizar request_buffer directamente por piezas:

char *request_save_ptr, *line_save_ptr, *line;
line = strtok_r(request_buffer, “\r\n”, &request_save_ptr);
char *method = strtok_r(line, ” “, &line_save_ptr);
if (strcmp(method, “GET”) == 0) {
//.. seguir analizando

¿Puedo usar strtok directamente en request_buffer? Sé que strtok modifica el char * pasado, y mi intuición me dice que esto podría interferir con open_memstream, pero no he encontrado nada al respecto en la página del manual de open_memstream; y, bueno, el código funciona correctamente. No prefiero la opción “copiar y analizar” porque no quiero usar el doble de memoria. Pero si es necesario, podría seguir adelante con esta opción ya que cada cliente se maneja en un fork() separado, por lo que la memoria no es un problema importante.

Gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Puede usar strtok directamente en request_buffer ya que no interfiere con open_memstream. Sin embargo, si desea evitar usar el doble de memoria, puede usar la opción “copiar y analizar”. Esto asegurará que el uso de memoria no se duplique y el cliente se maneje en un fork() separado.

Comments are closed.