2010-06-10 4 views
5

Estoy trabajando en un proyecto y necesito crear una API. Estoy usando sockets para comunicarme entre el servidor (mi aplicación) y los clientes (las otras aplicaciones que usan mi API).Cómo ocultar las funciones auxiliares de la API pública en c

Este proyecto se encuentra en C no C++

Vengo de un fondo Linux y este es mi primer proyecto el uso de Windows, Visual Studio 2008 y librerías DLL.

Tengo comunicación trabajando entre el cliente y el servidor, pero tengo algunas que están duplicadas en ambos proyectos. Me gustaría crear una biblioteca (probablemente un archivo dll) a la que ambos proyectos puedan enlazar, de modo que no tenga que mantener un código adicional.

También tengo que crear la biblioteca que tiene la API que necesito para poner a disposición de mis clientes. Dentro de las funciones de API que quiero que sean públicas están las llamadas a estas funciones auxiliares que son "código duplicado", no quiero exponer estas funciones a mi cliente, pero sí quiero que mi servidor pueda usar esas funciones. ¿Cómo puedo hacer esto?

Trataré de aclarar con un ejemplo. Esto es con lo que comencé.

de Project Server:

int Server_GetPacket(SOCKET sd); 
int ReceiveAll(SOCKET sd, char *buf, int len); 
int VerifyLen(char *buf); 

Proyecto Cliente:

int Client_SendCommand(int command); 
int Client_GetData(int command, char *buf, int len); 
int ReceiveAll(SOCKET sd, char *buf, int len); 
int VerifyLen(char *buf); 

Esto es un poco de lo que me gustaría terminar con:

//Server Project: 
int Server_GetPacket(SOCKET sd); 

// library with public and private types 
// private API (not exposed to my client) 
int ReceiveAll(SOCKET sd, char *buf, int len); 
int VerifyLen(char *buf); 
// public API (header file available for client) 
int Client_SendCommand(int command); 
int Client_GetData(int command, char *buf, int len); 

Gracias cualquier ayuda se agradece .

Respuesta

1

Si coloca las funciones "privadas" en un archivo DLL y las hace externamente invocables por medios normales (por ejemplo, invocables mediante un proceso que carga la biblioteca), también serán "públicas" para otras. Es posible ofuscar los nombres y cosas por el estilo, pero probablemente esta no sea una buena solución.

Puede ser mejor ponerlos en una biblioteca enlazada estáticamente en lugar de una DLL. Sin embargo, tenga en cuenta que, incluso en este caso, alguien puede desmontar el binario obviamente y llegar al código.

+0

Me preocupa más proporcionar una API limpia que solo contenga las funciones públicas. Solo quiero evitar que todas las funciones auxiliares sean parte de la API. ¿Está diciendo que creo una biblioteca estática para las funciones "privadas" y luego pongo las funciones de "API pública" en una DLL? – emge

+0

@emge: Esa es una posibilidad. Depende de tu arquitectura de desarrollo un poco si tiene sentido. Una solución "más simple" sería simplemente incluir los archivos fuente en su proyecto y compilarlos directamente en el binario. A continuación, cree la DLL API pública como un proyecto separado con las funciones exportadas deseadas. –

+0

Gracias, me gusta la solución "más simple", pero ¿cómo puedo solucionar el problema de tener código duplicado si solo incluyo el archivo fuente en mi proyecto y la API DLL necesita usar algunas de esas mismas funciones? – emge

5

Uso

static int ReceiveAll(SOCKET sd, char *buf, int len); 

etc para hacer las funciones de la unidad local para archivo/compilación.

+0

si declaro las funciones privadas como estáticas y las pongo en una biblioteca, ¿podría llamarlas desde mi proyecto de servidor, es decir, desde Server_GetPacket()? – emge

+0

Las funciones en el mismo * archivo * las verán. Otros no lo harán. –

0

Si solo desea exponer determinadas funciones en su archivo DLL, puede crear un archivo de exportación (dllname.def) que le dé al vinculador cuando cree el proyecto. Este archivo de exportación contiene una lista de las funciones que desea que estén disponibles públicamente para las aplicaciones que usan su DLL.

Consulte el artículo de MSDN here para obtener más información al respecto.

Creo que también puede lograr una funcionalidad similar utilizando la palabra clave __declspec(dllexport) en las funciones que desea exportar.

Cuestiones relacionadas