Man Linux: Main Page and Category List


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

       netpipes 4.2


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

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


       This is not the manual page for  the  getpeername  system  call.   That
       manual  page  is  in section 2.  You can access it using a command like
       "man 2 getpeername" or "man -s 2 getpeername".   I  apologize  for  the

       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 getpeername 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 getsockname 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  single  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.  Starting on the fifth line it prints all the  numeric
       internet  addresses  returned  by the gethostbyaddr(3) library routine.
       On the rest of the lines it prints all the host names.


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


       I originally designed getpeername so that a faucet-spawned shell script
       could find out  who  was  talking  to  it  (and  maybe  perform  access
       control).   I  added  getsockname for completeness.  Now I realize that
       getsockname  is  useful  for  multi-homing  services.   However,   most
       software  that  you  want  to  understand multi-homing (httpd, ftpd) is
       already capable of doing it, and much more efficiently  than  a  script
       wrapper.  Still, it might come in handy some day.

       client$ hose smtp --in ./getpeername

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

       client$ hose smtp --in ./getpeername -v

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

       client$ hose 80 -in ./getpeername
       ./getpeername: getpeername failed on descriptor 0: Socket is not connected

       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 connection 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 80 -fd0 ./getpeername -v

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

       client$ hose 80 -fd0 sh -c " ./getpeername -v | \
            tail +5 | egrep -v ’^[0-9.]*$’ | head -1"


       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

       If you encounter any other errors, clue me in.


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


       These programs are vulnerable to  reverse  DNS  lookup  spoofing.   You
       probably want to add ‘‘nospoof on’’ to your /etc/host.conf.


       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.


       "Hi Mom! Hi Dad!"


       Copyright (C) 1995-98 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
       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.


       Robert Forsman
        Purple Frog Software

                                March 18, 1998                  GETPEERNAME(1)