Search code examples
linuxsocketssetsockoptsystemtap

See socket options on existing sockets created by other apps?


I'd like to test whether particular socket options have been set on an existing socket. Ie, pretty much everything you can see in:

#!/usr/bin/env python
'''See possible TCP socket options'''

import socket

sockettypelist = [x for x in dir(socket) if x.startswith('SO_')]
sockettypelist.sort()
for sockettype in sockettypelist:
    print sockettype

Anyone know how I can see the options on existing sockets, ie those created by other processes? Alas nearly all the documentation I read on Python socket programming is about making new sockets.


Solution

  • Unfortunately, nailer's answer only catches the SOL_TCP level socket options and does not the SOL_SOCKET level ones (like SO_KEEPALIVE).

    Some of the distributions ships some examples together with systemtap. One of them is pfiles.stp that you can use to get the socket options from the sockets of a running process. Example from the file:

    $ ./pfiles.stp `pgrep udevd`
       787: udevd
      Current rlimit: 32 file descriptors
       0: S_IFCHR mode:0666 dev:0,15 ino:396 uid:0 gid:0 rdev:1,3
          O_RDWR|O_LARGEFILE 
          /dev/null
       1: S_IFCHR mode:0666 dev:0,15 ino:396 uid:0 gid:0 rdev:1,3
          O_RDWR|O_LARGEFILE 
          /dev/null
       2: S_IFCHR mode:0666 dev:0,15 ino:396 uid:0 gid:0 rdev:1,3
          O_RDWR|O_LARGEFILE 
          /dev/null
       3: S_IFDIR mode:0600 dev:0,9 ino:1 uid:0 gid:0 rdev:0,0
          O_RDONLY 
          inotify
       4: S_IFSOCK mode:0777 dev:0,4 ino:2353 uid:0 gid:0 rdev:0,0
          O_RDWR 
          socket:[2353]
          SO_PASSCRED,SO_TYPE(2),SO_SNDBUF(111616),SO_RCVBUF(111616)
            sockname: AF_UNIX
       5: S_IFSOCK mode:0777 dev:0,4 ino:2354 uid:0 gid:0 rdev:0,0
          O_RDWR 
          socket:[2354]
          SO_TYPE(2),SO_SNDBUF(111616),SO_RCVBUF(33554432)
            ulocks: rcv
       6: S_IFIFO mode:0600 dev:0,6 ino:2355 uid:0 gid:0 rdev:0,0
          O_RDONLY|O_NONBLOCK 
          pipe:[2355]
       7: S_IFIFO mode:0600 dev:0,6 ino:2355 uid:0 gid:0 rdev:0,0
          O_WRONLY|O_NONBLOCK 
          pipe:[2355]