2008-12-07 4 views
5

Ich erstelle einen TCP-Socket, ohne die Portnummer zu stören, die an [socket.sin_port = 0] gebunden wird. Aber später, wenn ich die Portnummer des Clients drucken möchte, wie mache ich das? Die Client-C-Anwendung (unter Linux) erstellt viele Clients, die mit dem Server verbunden werden. Um Probleme zu debuggen, erfasse ich den Verkehr auf ätherisch. Ich dachte daran, die Port-Nummer in Logs zu drucken, während das Problem auftaucht, so dass das Filtern auf ätherisch einfach wird.Ermitteln der TCP-Portnummer, an die der Client gebunden wurde

Jede Hilfe wäre willkommen.

-Prabhu

Antwort

10

Verwenden Sie die getsockname() aufrufen, die Socket-Adresse und Port nach einer erfolgreichen Verbindung zu bekommen.

Bearbeiten: korrekte Methodenname. Manchmal kann ich kein einfaches Wort von einem Fenster in ein anderes kopieren!

2

Ich glaube, Darron bedeutete getsockname(). Dies ist das, was Sie wollen, wenn Sie die Portnummer auf der Clientseite (die Seite, die connect() aufruft) programmgesteuert ermitteln müssen. Auf der Serverseite (die Seite, die bind() aufruft), würden Sie getpeername() verwenden, um die gleiche Information von dem verbundenen Socket zu erhalten.

Wenn Sie jedoch debuggen und den Code nicht ändern können, verwenden Sie am Ende je nach Betriebssystem Dinge wie das Dienstprogramm netstat oder sockstat. Ich bin nicht sicher, welche Dienstprogramme unter Linux (oder sogar Ihrem bestimmten Paket) verfügbar sind, aber ich würde mit man sockstat beginnen. Wenn es installiert ist, können Sie es von beiden Seiten ausführen und sehen, welche Endpunkte welchen Prozessen zugewiesen wurden. Kombinieren Sie dies mit grep und Sie können normalerweise herausfinden, welche Adresse in Ethereal gefiltert werden soll. Viel Glück!

0
lsof -p <process id> | grep TCP