🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #12857

Re: Estructuras por socket

#12857
From: J.A. Gutierrez
Date: Tue, 08 May 2001 11:56
122 lines
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-mail
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>

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))