From: vjs@rhyolite.wpd.sgi.com (Vernon Schryver)
Newsgroups: comp.sys.sgi,comp.unix.admin,comp.unix.internals,comp.unix.misc,comp.unix.bsd
Subject: Re: Problem to transfer large data via socket communication - Need Help
Date: 11 Jan 93 17:09:24 GMT
Organization: Silicon Graphics, Inc.  Mountain View, CA

In article <1993Jan11.133545.16876@cc.ic.ac.uk>, vulture@imperial.ac.uk (Thomas Sippel - Dau) writes:
> In article <1993Jan8.071612.13716@news.uni-stuttgart.de>, wnkretz@ikesg1.energietechnik.uni-stuttgart.de (Oliver Kretzschmar) writes:
> .....
> -   to send data from socket to socket (stream):
> - 
> -         write(socket,(char*)data,buffer)
> -         read(socket,(char*)data,buffer)
> - 
> -   But now we've problems sending/receiving large data for
> -   example 50*50*50 matrix of floats or larger. Is there any
> -   transfer-bufferlimitation by using streamsockets, that we can
> -   manipulate ?
> 
> Yes, there is a number of streams buffers configured in the kernel, see 
> (on IRIX) /usr/sysgen/master.d/kernel.

No, the number of streams buffers configured in the Silicon Graphics
version of UNIX, "IRIX", have absolutely nothing to do with such
uses of TCP/IP.  IRIX uses STREAMS buffers only for the MIDI and some
audio code, the keyboard, and some other serial I/O devices.

Under certain circumstances, the number of MBUFs can affect pure TCP/IP
uses, but almost certainly none concerning the original questioner.

The use of both mbufs and STREAMS buffers, events and queues can
be monitored with `netstat`.  However, that is almost their only
connection in IRIX.  Other versions of UNIX, especially those using
STREAMS based TCP/IP are different from IRIX, which includes fairly
recent versions of 4.3BSD style network code--i.e. "sockets".


> However, you main error is to use read/write, which is for "unbuffered"
> I/O and has generally been designed to be fast and for people who know
> what they are doing and are willing to cope with hardware limitations 
> themselves.
> 
> For applications programers the latter is not generally true, so use 
> fread/fwrite and swallow the extra layer of software for the benefit
> of generality.


In general, UNIX hides all considerations of "hardware limitations"
from application programmers.  The need to use various hacks like
"physio" to get to the hardware is both an advantage and disadvange of
most varients of UNIX.

Stdio would add a very costly layer in such an application as I
understood to be the original questioner's.  Stdio would require at
least one extra copy of the data.  Since the current IRIX version of
stdio defines BUFSIZ to be 8K, the reads and writes of the application
might be much smaller.  As wrote recently, 8K buffers are "below the
knee" of the pure TCP/IP performance curve of IRIX, at least on fast
media such as FDDI.

The fread() and fwrite() functions of the stdio package in IRIX does no
more than some simple buffering on top of the read() and write() system
calls.  One generally uses fread() and fwrite() only when performance
is not an issue, and either when you don't want to deal with the short
read()'s caused by the nature of TCP/IP or when you are also using
formatting or scanning functions such fprintf() or fscanf().


Vernon Schryver,  vjs@sgi.com