Frage

Ich möchte testen, ob bestimmte Socket-Optionen auf einem vorhandenen Sockel festgelegt wurden. Dh, so ziemlich alles, was Sie sehen 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

Wer weiß, wie ich die Optionen sehen kann, auf vorhandene Steckdosen, dh solche, die durch andere Prozesse erstellt? Leider fast alle Unterlagen las ich auf Python Socket-Programmierung ist über neue Steckdosen zu machen.

War es hilfreich?

Lösung

Leider Antwort, Nagler einzigem fängt die SOL_TCP Ebene Socket-Optionen und nicht die SOL_SOCKET Ebene diejenigen (wie SO_KEEPALIVE).

Einige der Verteilungen Schiffe einige Beispiele zusammen mit systemtap. Einer von ihnen ist pfiles.stp, dass Sie die Socket-Optionen erhalten von den Buchsen eines laufenden Prozesses verwenden können. Beispiel aus der Datei:

$ ./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]

Andere Tipps

Dies ist in Python nicht möglich.

Der Linux-Kernel bietet keinen Mechanismus in / procfs auf TCP-Socket-Staaten zu melden (im Gegensatz zu BSD und anderen Unix-artigen Betriebssystemen). Da der Kernel diese Informationen nicht aussetzen wird, können wir sie nicht sehen, über das Python-linux-procfs Modul oder ähnliches.

Siehe lsof FAQ Artikel 3.14.1 :

Q. ‚Warum nicht lsof melden Socket-Optionen, socket Zustände und TCP-Flags und Werte für meinen Dialekt?‘.

A. "Socket-Optionen, socket Zustände und TCP-Flags und Werte sind über das / proc-Dateisystem nicht zur Verfügung.

Allerdings SystemTap Network tapset einen tcp.setsockopt Breakpoint zur Verfügung, die verwendet werden können Socket-Optionen durch einen Prozess auf abzufangen, jedoch wäre dies in stap behandelt werden, anstatt Python.

Ich habe die erforderliche tapset wie folgt:

# Show sockets setting options

# Return enabled or disabled based on value of optval
function getstatus(optlen)
{
    if ( optlen == 1 )
        return "enabling"
    else
        return "disabling"
}

probe begin
{
    print ("\nChecking for apps making socket calls\n")
}

# See apps setting a socket option 
probe tcp.setsockopt
{
    status = getstatus(user_int($optval))
    printf ("  App '%s' (PID %d) is %s socket option %s... ", execname(), pid(), status, optstr)
}

# Check setting the socket option worked
probe tcp.setsockopt.return
{
    if ( ret == 0 )
        printf ("success")
    else
        printf ("failed")
    printf ("\n")    
}


probe end
{
    print ("\nClosing down\n")
}

die Socket-Bibliothek ist in der Tat neue Steckdosen zu erstellen und sie zu manipulieren. in anderen Prozessen erstellt Steckdosen sind nicht sichtbar, aus offensichtlichen Sicherheitsgründen: Sie jede beliebige Anwendung die Änderung der Art und Weise nicht wollen, würden Sie Ihre eigene Buchse verwalten, oder noch schlimmer Lesen von Daten aus Ihrer Steckdose, bevor Sie. so Buchsen sind Systemobjekte, durch einen Griff Bezug genommen wird, mit (auf einem anständigen OS) Zugriffsrechte auf sie anzuwenden. das ist, warum Sie nicht vorhandene Steckdosen durch andere Prozesse erstellt auflisten können.

schließlich, können Sie einen Weg finden, Sockethandles abrufen (es soll eine Art und Weise irgendwo sein, ich erinnere mich, einen Weg zu sehen System zur Liste auf Windows übernimmt), aber dies würde immer noch auf Ihre OS sehr spezifisch sein, so wahrscheinlich nicht verfügbar in python, und Sie haben möglicherweise noch nicht das Recht, irgendetwas auf diesen Sockeln durchführen.

jetzt, wenn Sie neugierig zu wissen, wie eine bestimmte Anwendung eine bestimmte Funktion erreicht, gibt es andere Möglichkeiten: die naheliegendste ist ein Proxy oder eine Firewall zu installieren (ich erinnere mich, dass meine Kerio WinRoute Firewall aufgeführt Socket-Optionen) oder nur fragen, wie Stackoverflow diese Leistung zu erreichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top