Aquí está el fondo rápido: tengo un cliente y un programa de servidor que se comunican entre sí a través de un socket Unix. Cuando analizo los mensajes recibidos en el lado del servidor, intento usar strncmp para determinar qué acción tomar.strncmp uso correcto
El problema que tengo es averiguar exactamente qué usar para el argumento de longitud de strncmp. La razón por la cual esto es problemático es porque algunos de mis mensajes comparten un prefijo común. Por ejemplo, tengo un mensaje "getPrimary", que hace que el servidor responda con una dirección de servidor primaria, y un mensaje "getPrimaryStatus", que hace que el servidor responda con el estado del servidor primario. Mi idea inicial era hacer lo siguiente:
if(strncmp(message,"getPrimary",strlen("getPrimary"))==0){
return foo;
}
else if(strncmp(message,"getPrimaryStatus",strlen("getPrimaryStatus"))==0){
return bar;
}
El problema con esto es cuando envío el servidor "getPrimaryStatus", el código siempre devolverá foo porque strncmp no está comprobando lo suficientemente lejos en la cadena. Podría pasar strlen (mensaje) como argumento de longitud a strncmp, pero esto parece frustrar el propósito de usar strncmp, que es para evitar el desbordamiento en el caso de una entrada inesperada. Tengo una variable estática para la longitud máxima de mensaje que puedo leer, pero parece que se pasa esto porque la longitud solo garantiza que si el mensaje se desborda, los efectos se reducen al mínimo.
He encontrado algunas soluciones, pero no son muy bonitas, así que me preguntaba si habría una forma común de resolver este problema. Como referencia, mis soluciones actuales son: . Ordene mis declaraciones if/else if de tal manera que los mensajes con prefijos comunes se comprueben en orden de longitud descendente (lo que parece una buena manera de lanzar una mina antipersonal). en mi código para cualquiera que intente agregarle algo más adelante).
Grupo mis mensajes con prefijos comunes juntos y buscar la primera sufijo:
if(strncmp(message,"getPrimary",strlen("getPrimary"))==0){
if(strncmp(message,"getPrimaryStatus",strlen("getPrimaryStatus"))==0){
return bar;
else
return foo;
}
}
pero es algo que se siente desordenado, sobre todo porque tengo alrededor de 20 diferentes mensajes posibles que estoy manejando.
Crear una matriz de todos los mensajes posibles que tengo, añadir una función a mi secuencia init que ordenará la matriz descendiendo la longitud, y hacer que mi código busque los elementos de esa lista hasta que encuentre una coincidencia. Esto parece complicado y tonto.
Parece que esto debería ser un problema bastante común que debería haber una solución para ello en alguna parte, pero no he podido encontrar nada hasta el momento.
¡Gracias de antemano por la ayuda!
Parece que esta es la solución más simple. Esta es realmente la primera vez que uso conectores de Unix para facilitar la comunicación entre procesos, y escribí el código de manejo del socket hace aproximadamente dos meses ... ¡Había olvidado por completo que estaba usando read(), que devuelve el número de bytes leídos! –
Creo que pasar el tamaño del mensaje a strncmp es una solución incompleta a su problema. Por favor, mira mi solución para más detalles. –
Las comparaciones entre cadenas con muchos caracteres coincidentes se pueden realizar de forma más eficiente utilizando un enfoque de "fragmentación", mientras que las comparaciones entre cadenas que difieren desde el principio pueden ser más eficientes utilizando un enfoque de carácter a la vez. No me sorprendería que algunas implementaciones de strncmp usen fragmentación cuando "n" es grande, aunque sería mejor si hubiera funciones separadas para los casos de uso donde es probable la coincidencia con aquellos donde es poco probable. – supercat