Article View: es.comp.os.linux.programacion
Article #12857Re: Estructuras por socket
From: J.A. Gutierrez
Date: Tue, 08 May 2001 11:56
Date: Tue, 08 May 2001 11:56
122 lines
5027 bytes
5027 bytes
cesar m. redondo <cesar.redondo@mad.tecsidel.es> wrote:
:> no es que no vaya a funcionar, funciona perfectamente; lo
:> que pasa es que no tiene sentido.
: no funciona, en esto consiste mi proyecto fin de carrera y he hecho montones
: (pero montones) de pruebas y te aseguro que no funciona mandar un char* en
: una estructura.
:> Estas pasando una direccion de memoria que (se supone)
:> apunta a una cadena del proceso cliente al servidor, en
:> el que esa misma posicion de memoria a saber a donde apunta.
: Siento contradecirte pero no pasa la direcci�n de memoria, pasa el contenido
: del char*, porque los char* sabes que tienen un tratamiento especial y
: siempre que pones char* va al contenido de la direcci�n apuntada por esa
estimado colega, me temo que se equivoca usted. :-)
: varible char*, te envia por el socket la cadena de texto que tengas en esa
: variable lo que pasa es que no te env�a el \0 con lo que en el servidor al
: reconstruir la estructura se cree que es cadena de texto hasta que encuentra
: un 0 que puede ser un 0 de datos enteros que vengan posteriormente, un
: ejemplo para explicar esto:
: typedef struct
: {
: int a;
: char* b;
: int c;
: int d;
: int e;
: };
: si tienes a=8, b=hola, c=6, d=0 y e=89;
querras decir *b="hola";
o bien b=0x7fff2e98 suponiendo que en 0x7fff2e98 y sucesivos
estan los caracteres h-o-l-a-\0
: en el servidor al recibir la estructura recibe:
: a=8, b=hola6, d=89 y e=*basura, lo que le de la gana poner, un entero
: grande seguramente*
recibe b=0x7fff2e98 (suponiendo igualdad de endianess y que
esa es la direecion asignada en el cliente)
: Por supuesto que no he comentado todav�a que en el servidor debes tener
: memoria reservada para la variable char* donde guardar la informaci�n que
en el servidor solo tienes que tener memoria reservada para
el tama~no de la estructura, que sera
sizeof(int) * 4 + sizeof(char *)
donde sizeof(char *) suelen ser 4 bytes independientemente de
la longitud de la cadena.
Eso es lo que se envia por el socket y eso es lo que recibe el
servidor.
: recibas, para que no escriba vete tu a saber donde.
: Este funcionamiento anomalo esta requetecomprobado.
Y no sera mas bien que no reservas memoria para el char* b
en el cliente y entonces estas metiendo, efectivamente, el
contenido de la cadena en la estructura? (a costa de machacar
los valores siguientes de la estructura) (e=basura? por que?)
si a una funcion tipo write() le pasas como argumento la
direccion de comienzo de una cadena; envia el contenido de
la cadena.
Pero si le pasas la direccion de una estructura, uno de cuyos
campos es la direccion de una cadena, pasa el contenido de
la estructura (que incluye la direccion de la cadena, pero no
el contenido de la misma).
Eso es asi en la funcion write (sea a socket o no) y en cualquier
otra.
Ejemplo-demostracion:
- foobar.c ----------------------------------------------------------------
#include <stdio.h>
int main()
{
typedef struct {
int i;
char *s;
double d;
} foo;
char host[17]="55.155.235.213";
foo bar;
bar.i=1;
bar.d=2;
bar.s=host;
fprintf(stderr,"%p\n", bar.s); fflush(stderr);
write(1,(void *)&bar,sizeof(foo));
exit(0);
}
---------------------------------------------------------------------------
$ ./foobar | od -x
7fff2e98
0000000 0000 0001 7fff 2e98 4000 0000 0000 0000
0000020
--
PGP and other useless info at \
http://www.cps.unizar.es/~spd/ \
finger://daphne.cps.unizar.es/spd \ Timeo Danaos et dona ferentes
ftp://ivo.cps.unizar.es/pub/ \ (Virgilio)
Technical Details
Message-ID:
<9d8msk$dkp$1@news.unizar.es>Path:
arc1-ca.pugleaf.net!newsfeed.google.com!newsfeed.stanford.edu!news.tele.dk!193.251.151.101!opentransit.net!jussieu.fr!news.rediris.es!news.unizar.es!not-for-mailReferences:
<3AF3F290.1030009@wanadoo.es> <874ruzsvb6.fsf@relativistic.homeip.net> <3AF64BC4.B737246B@mad.tecsidel.es> <9d652a$aoj$1@news.unizar.es> <3AF6B106.E6D64723@mad.tecsidel.es>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f86c8,5fd35ee70e813e32
X-Google-Attributes: gidf86c8,public
X-Google-ArrivalTime: 2001-05-08 04:39:29 PST
Path: arc1-ca.pugleaf.net!newsfeed.google.com!newsfeed.stanford.edu!news.tele.dk!193.251.151.101!opentransit.net!jussieu.fr!news.rediris.es!news.unizar.es!not-for-mail
From: "J.A. Gutierrez" <spd@daphne.cps.unizar.es>
Newsgroups: es.comp.os.linux.programacion
Subject: Re: Estructuras por socket
Date: 8 May 2001 11:56:04 GMT
Organization: Rank
Lines: 122
Message-ID: <9d8msk$dkp$1@news.unizar.es>
References: <3AF3F290.1030009@wanadoo.es> <874ruzsvb6.fsf@relativistic.homeip.net> <3AF64BC4.B737246B@mad.tecsidel.es> <9d652a$aoj$1@news.unizar.es> <3AF6B106.E6D64723@mad.tecsidel.es>
NNTP-Posting-Host: daphne.cps.unizar.es
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
X-Trace: news.unizar.es 989322964 13977 155.210.152.20 (8 May 2001 11:56:04 GMT)
X-Complaints-To: usenet@news.unizar.es
NNTP-Posting-Date: 8 May 2001 11:56:04 GMT
User-Agent: tin/1.4.5-20010409 ("One More Nightmare") (UNIX) (IRIX/6.2 (IP22))