Is there any way to get all opened sockets using c++? I know the lsof
command and this is what I'm looking for, but how to use it in a c++ application?
The idea is to get the FD of an opened socket by its port
number and the pid
.
Just open the files in /proc/net, like /proc/net/tcp, /proc/net/udp, etc. No need to slog through the lsof sources. :)
If you don't want to copy/paste or reimplement chunks of the lsof code, and it doesn't build any useful libraries you could leverage, you can still open a pipe to an lsof
process and peruse its output.
The lsof
command is prepared specifically such that it can be used from other programs including C, see the section: OUTPUT FOR OTHER PROGRAMS of man lsof
for more information. For example you can invoke lsof
with -F p
and it will output the pid of the processes prefixed with 'p'
:
$ lsof -F p /some/file
p1234
p4321
you can then use popen to execute this commmand in a child process and read from its standard output.
In C (or C++) you can use the NETLINK_SOCK_DIAG
interface. This is a socket that gives you access to all that information. You can filter on various parameters such as the interface the socket is attached to.
The documentation is spares, however, but I wrote a low level test to see whether I could get events whenever someone opened a new socket, but that didn't work. That being said, to list existing sockets, you can use the following code as a good starting point:
I think that this is cleaner than parsing the /proc/net/tcp
and other similar files. You get the same information, but it comes to you in binary.
It may also be simpler to use the libnml
library which is a layer over the socket. It does many additional verification on all the calls. However, just like the base NETLINK
interface, it's not very well documented (i.e. whether binding is important, flags you can use with TCP or UDP, etc.) The good thing is: you can always read the source to better understand what's going on.