Friday, May 6, 2011

How to get a list of open sockets in Linux using C?

Hello,

Is there a way to get a list of all open sockets ( socket address or socket descriptor ) in Linux using C in user-space or kernel?

Thank you

From stackoverflow
  • Open and read the following:

    /proc/net/tcp -a list of open tcp sockets

    /proc/net/udp -a list of open udp sockets

    /proc/net/raw -a list all the 'raw' sockets.

    These are like 'regular' files that you open and read with a filehandle and will give you all the information you could possibly need about each socket.

  • The raw data can be found at /proc/net/tcp, /proc/net/udp, etc. Refer to the header at the first line for a (terse) description.

  • In directory /proc/self/fd there are fake symlinks giving you all your open file descriptors - sockets give something like:

    lrwx------ 1 root root 64 2009-05-08 07:45 4 -> socket:[4921]
    lrwx------ 1 root root 64 2009-05-08 07:45 5 -> socket:[4918]
    lrwx------ 1 root root 64 2009-05-08 07:45 6 -> socket:[5395]
    

    Iterate them using opendir, readdir() and then interrogate them using readlink()

    If you know that FD 4 is a socket, you can then call getsockname() on it to get the local address family, address etc, if bound.

    Misha M : This does not work for all sockets. Mostly, I see my terminals on here. With multiple connections open, not all sockets are visible. Good tool non-the-less to have in addition to what Shane Mason noted. Thank you.
  • This program may be useful for you and demonstrates how to parse the /net/proc/* files sockstat.c

    Misha M : Thanks for the example. I was just going to go through the /proc/self/fd and check which links are sockets and generate the list that way. I'll post an update with my solution here. Thanks again
  • Is there any way to get a list of all open sockets ( socket address or socket descriptor ) in Windows using C in user-space or kernel?

0 comments:

Post a Comment