getpeername

Hurricane Electric Internet Services: Accounts starting at $9.95/month
Hurricane Electric Internet Services

NAME

       getpeername  -  get  information about this or that end of
       the socket's connection


SYNOPSIS

       getpeername [ -verbose ] [ -sock ] [ fd ]

       getsockname [ -verbose ] [ -peer ] [ fd ]


DESCRIPTION

       getpeername performs a getpeername(2) system call  on  one
       of its file descriptors specified by fd and prints out the
       results.  The default fd is 0 (stdin).  You may cause get-
       peername to behave like getsockname by providing the -sock
       argument.

       getsockname performs a getsockname(2) system call  on  one
       of its file descriptors specified by fd and prints out the
       results. The default fd is 0 (stdin).  You may cause  get-
       sockname to behave like getpeername by providing the -peer
       argument.

       There is a  severe  limitation  of  getpeername.   If  the
       remote process has closed the connection, getpeername will
       fail with a `Socket is not connected'  error.   This  will
       happen with dismaying frequency when the remote process is
       not dependent upon the local process for input and  it  is
       only  sending  small  amounts of output before closing the
       connection.  Hopefully the practical uses  of  getpeername
       (if there are any) will not exercise this problem.

         You  can  use getpeername to find out the address of the
       opposite end of a socket.  You can use getsockname to find
       out the address of the local end of a socket.  They are in
       fact the same program with different names.  We will refer
       to  both  of them by the name getpeername in the following
       description.

       getpeername knows how to display  peer  information  about
       UNIX  and  Internet  sockets.   If  you  try  to use it on
       another type of socket, it  will  fail  with  an  "unknown
       address family" error.  If you regularly deal with strange
       sockets and wish getpeername to work with  them,  send  me
       email.

       If  the  socket  is a UNIX domain socket, then getpeername
       prints the name of the file (which is the port) on a  sin-
       gle line.  If -verbose was specified, getpeername prints a
       more detailed report consisting of the word `Unix' on  the
       first  line,  the  word `Port' on the second line, and the
       name of the file on the third line.

       If the socket is  an  Internet  socket,  then  getpeername
       prints  the  port number on the first line and the numeric
       address on the second line.  If  -verbose  was  specified,
       getpeername  prints  a  more detailed report consisting of
       the word `Internet' on the first line, the word `Port'  on
       the  second  line,  the  port numer on the third line, the
       word `Host' on the fourth line.  On the fifth and  follow-
       ing  lines it prints all of the numeric internet addresses
       followed by all the host names returned  by  the  gethost-
       byaddr(3) library routine.



EASTER EGG

         If  you specify -verbose twice, the program will print a
       copyright notice.



EXAMPLES

         I have a feeling any practical uses of  the  getpeername
       program are fairly complicated.  If you actually do use it
       in a non-trivial way, drop me a line.

              client$ hose mail.cis.ufl.edu smtp -in ./getpeername
              25
              128.227.224.13

         You connected to mail.cis.ufl.edu on the SMTP port (port
       25).  For a verbose report:

               aviator:80 $ ./hose mail.cis.ufl.edu smtp -in ./getpeername -v
              Internet
              Port
              25
              Host
              128.227.224.13
              128.227.100.196
              inlet.cis.ufl.edu

         Now let's give an example of a race condition which will
       cause getpeername to fail:

              client$ hose www.cis.ufl.edu 80 -in ./getpeername

         The HTTP daemon tries to read a request, finds that half
       of  the  full  duplex  connection  closed  (by the special
       behavior of the -in option on hose(1)) and drops the  con-
       nection  before getpeername can query the file descriptor.
       We can cause the HTTP daemon to wait  for  us  by  leaving
       both halves of the duplex connection open.

              client$ hose www.cis.ufl.edu 80 -fd0 ./getpeername -v
              Internet
              Port
              25
              Host
              128.227.224.13
              128.227.100.196
              inlet.cis.ufl.edu

        And,  finally, let's extract some useful information from
       our socket.

              client$ hose www.cis.ufl.edu 80 -fd0 sh -c " ./getpeername -v | \
                   tail +5 | egrep -v '^[0-9.]*$' | head -1"
              sand.cis.ufl.edu



ERRORS

       Socket operation on non-socket
         The fd you specified does not  refer  to  a  socket,  or
       refers  to  a  socket  that has been closed.  This happens
       when you run getpeername by itself (it  is  unlikely  that
       any  of  the  file  descriptors attached to an interactive
       shell are actually  sockets),  or  if  you  goof  up  your
       faucet/hose  command  and  forgot  to  dup(2)  one of your
       descriptors, or if the remote machine manages to close the
       connection before getpeername could run.

       Bad file number
         You  gave  it  a  bad  file  number for fd.  If you have
       enough skill to actually generate this error, you probably
       know what is wrong.

       If you encounter any other errors, clue me in.




SEE ALSO

       netpipes(1),  faucet(1),  hose(1), sockdown(1), socket(2),
       shutdown(2),



NOTES

         Just avoid doing anything funky like passing getpeername
       strings and it should serve you well.

         DOH!  3.0 didn't use the ntohs macro on the port numbers
       so the output was bogus on machines with non-network-order
       port numbers (like Linux-i386).  3.1 fixed this.



CREDITS

       "Hi Mom! Hi Dad!"



COPYRIGHT

       Copyright (C) 1995 Robert Forsman

       This  program  is  free  software; you can redistribute it
       and/or modify it under the terms of the GNU General Public
       License  as  published  by  the  Free Software Foundation;
       either version 2 of the License, or (at your  option)  any
       later version.

       This  program  is  distributed in the hope that it will be
       useful, but WITHOUT ANY WARRANTY; without even the implied
       warranty  of  MERCHANTABILITY  or FITNESS FOR A PARTICULAR
       PURPOSE.  See the GNU  General  Public  License  for  more
       details.

       You  should have received a copy of the GNU General Public
       License along with this program; if not, write to the Free
       Software  Foundation,  Inc.,  675  Mass Ave, Cambridge, MA
       02139, USA.



AUTHOR

        Robert Forsman
        thoth@cis.ufl.edu
        Purple Frog Software
        http://www.purplefrog.com/~thoth/
Hurricane Electric Internet Services: Accounts starting at $9.95/month
Hurricane Electric Internet Services
Copyright (C) 1998 Hurricane Electric. All Rights Reserved.