[C con Clase] Ayuda Variable Me Vuelve Loco

Steven Davidson steven en conclase.net
Mie Ago 8 18:25:45 CEST 2007


Hola Diego,

El pasado 2007-08-08 08:05:57, D1e6o! escribió:

D> Hola gente... me hace horas estoy perdiendo de a poco la paciencia con esto
D> :D Pasa que una variable me está volviendo loco...
D> Alguien me podrá ayudar??
D> El tema es el siguiente. En el main tengo un archivo externo incluído donde
D> tiene una línea que dice:
D> extern char buffer[512];
D> y otra:
D> extern int enviar(char *buffer,SOCKET socket);

No es necesario indicar 'extern' para una función, ya que por defecto todas las funciones globales son externas.

D> Por lo que no tendría que redeclararla... la utilizo normalmente... y me da
D> algunos dolores de cabeza:
D> strcpy(buffer,"flksdjfdkjs");
D> enviar(buffer,socket);

Ambas sentencias son correctas.

D> en otro archivo (sock.c) donde sí esta declarada la variable buffer como
D> char buffer[512];
D> Se encuentra la función enviar
D> cuando quiero que envíe lo que hay en el buffer no lo hace... manda alguna
D> que otra vez solo unos caracteres de ella (en realidad 4)....
D> pero si pongo en el main
D> enviar("fjksdhfjhdfjkasdhjkhkfjsfdsakjfsdkljfaldsjk",socket);
D> Lo hace con normalidad...
D> La funcion enviar es simple:
D> int eviar(char *buffer, SOCKET conn_soket){
D> return send(conn_socket,buffer,sizeof(datos),0);}

Creo que lo has copiado incorrectamente. Sospecho que es 'sizeof(buffer)'; o sea,

int eviar( char *buffer, SOCKET conn_soket )
{
  return send( conn_socket, buffer, sizeof buffer, 0 );
}

De todas maneras, seguiría siendo incorrecto. La variable 'buffer' es un puntero y por tanto su tamaño es constante. Lo más seguro es que 'sizeof(char *)' resulte en 4 (bytes), si tienes un compilador y una plataforma de 32 bits.

D> nada más!!!!
D> Y lo peor de todo es que si agrego estas lineas en la función enviar:
D> sprintf(buffer,"%d %s",(int) sizeof(buffer),buffer);
D> MessageBox(hwnd,buffer,TITULO,MB_OK);
D> Me muestra un msgbox que dice 4 4 4 4 4 4 4 4 4 4.... solo eso...
D> Todo raro muy raro.! alguien tiene alguna idea de que es lo que hago mal?

Como he mencionado anteriormente, estás usando 'sizeof(buffer)' lo cual es un puntero y por tanto resultará en 4 bytes para una plataforma de 32 bits.

Lo que necesitas es la cantidad de caracteres (o bytes) en 'buffer'. Tienes dos posibles soluciones:
1. Internamente, usa 'strlen()' para averiguar la cantidad de caracteres. Obviamente, esto sólo funcionará si es una cadena de caracteres terminada en cero; o sea, el carácter nulo.

2. Pasa la cantidad de bytes como otro parámetro para la función 'enviar()'. Por ejemplo,

int eviar( char *buffer, int nBuf, SOCKET conn_soket )
{
  return send( conn_socket, buffer, nBuf, 0 );
}


Espero que esto te aclare las dudas.

Steven


Más información sobre la lista de distribución Cconclase