Date: Fri, 15 Nov 1996 14:37:11 -0600 (CST) From: Joe Greco <jgreco@brasil.moneng.mei.com> To: fenner@parc.xerox.com (Bill Fenner) Cc: terry@lambert.org, jdp@polstra.com, scrappy@ki.net, jgreco@brasil.moneng.mei.com, hackers@freebsd.org Subject: Re: Sockets question... Message-ID: <199611152037.OAA28878@brasil.moneng.mei.com> In-Reply-To: <96Nov15.112419pst.177557@crevenia.parc.xerox.com> from "Bill Fenner" at Nov 15, 96 11:24:14 am
next in thread | previous in thread | raw e-mail | index | archive | help
> In message <199611151706.KAA26239@phaeton.artisoft.com> Terry wrote: > >How do I read into a structure on a machine that demands aligned > >data access? > > You read into an intermediate buffer and copy it. You have to convert from > network to machine representation anyway, so this isn't (much) more overhead. > Or you use UDP if you want a record-oriented protocol. Actually... I usually found it easier to do the following. #include <stdio.h> /* * One dull variant of Joe's "xread" function. */ int xread(fd, buf, siz) int fd; char *buf; int siz; { int rval; int chrs = 0; while (siz) { if ((rval = read(fd, buf, siz)) < 0) { return(rval); } chrs += rval; siz -= rval; buf += rval; } } int main() { int rval; struct big_ugly { yadda; yadda; yadda; } data; if ((rval = xread(fd, (char *)&data, sizeof(data))) != sizeof(data)) { fprintf(stderr, "Help me, I am on fire, xread returned %d\n", rval); } } This of course assumes you either do not need to do byte reordering, or do it elsewhere. ... JG
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199611152037.OAA28878>