Réseaux et Télécom » [C] Qui est au bout du fil..?
Catégorie:  
   
[C] Qui est au bout du fil..?
Publié le 03/02/2009 @ 16:47:07,
Par blietaer
Bonjour,

J'aurais besoin de faire un petit bout de netstat, mais sans réinventer la roue...ni appeler netstat :kiki:

En fait, dans un programme C, je voudrais savoir qui est à l'autre bout de la connection TCP dont je connais le port et un des deux peer (la machine sur laquelle tourne le-dit programme)

Attention, le soquet n'est _pas_ initialisé par ce programme (il est en fait déjà démarré ailleurs. Ex: telnet, netcat,...) :disapointted:

Je voudrais donc, à la netstat, donner à une fonction le numero du port et récupérer l'IP de l'autre peer.... :eek:

possible? :tinostar:

Plus compliqué que de passer un "netstat -laputen | grep 3333" à un system(); ?
(solution que je voudrais éviter parce que laide...non?)


Merci
Et au besoin s'arrêter.
   
[C] Qui est au bout du fil..?
Publié le 03/02/2009 @ 16:56:28,
Par Dr_Dan
Tcpview de sysinternals.. :petrus:
http://technet.microsoft.com/en-us/sysinternals/default.aspx
Se tromper est humain ; Vraiment foutre la merde necessite le mot de passe de root. :petrus:
   
[C] Qui est au bout du fil..?
Publié le 03/02/2009 @ 17:16:08,
Par blietaer
j'ai précisé que je parlais de monde Linux?
ah non...voila qui est fait.
Et au besoin s'arrêter.
   
[C] Qui est au bout du fil..?
Publié le 03/02/2009 @ 17:20:08,
Par philfr
Sous linux ?

Edith: ah, ok...

Parser le fichier /proc/net/tcp est la solution...

Dernière édition: 03/02/2009 @ 17:21:01
   
[C] Qui est au bout du fil..?
Publié le 03/02/2009 @ 17:25:40,
Par blietaer
GENIAL !
Et au besoin s'arrêter.
   
[C] Qui est au bout du fil..?
Publié le 03/02/2009 @ 17:35:27,
Par philfr

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
FILE *fp;
char buffer[80];
int n, la, lp, ra, rp;
int ret;
int port;
struct in_addr radd;

if(argc != 2)
{
fprintf(stderr, "Usage %s <local port number>\n", argv[0]);
exit(1);
}

port=strtol(argv[1], NULL, 0);
fp=fopen("/proc/net/tcp", "r");
while(!feof(fp))
{
fgets(buffer, sizeof(buffer), fp);
ret=sscanf(buffer, "%d: %x:%x %x:%x", &n, &la, &lp, &ra, &rp);
if(ret==5)
{
if(lp==port)
{
radd.s_addr=ra;
printf("Remote address %s, remote port %d\n", inet_ntoa(radd), rp);
}
}
}
}

Dernière édition: 03/02/2009 @ 23:03:13
   
[C] Qui est au bout du fil..?
Publié le 03/02/2009 @ 18:03:04,
Par blietaer
:prosterne:
Et au besoin s'arrêter.
   
[C] Qui est au bout du fil..?
Publié le 03/02/2009 @ 23:02:56,
Par philfr
N'oublie pas qu'à l'autre bout d'un même port, tu peux en avoir plusieurs autres (mon prog s'arrête au premier, sans raison, je corrige).
Et si tu veux aussi les connexions IPv6, c'est /proc/net/tcp6 que tu dois parser.
   
[C] Qui est au bout du fil..?
Publié le 04/02/2009 @ 09:11:42,
Par blietaer
C'est typiquement ce genre de choses qui m'excitent sous Linux mais qui m'énerve aussi d'avoir sous la main sans le savoir...j'espère que le nouveau livre que viens d'acheter (Essential Linux Drivers) m'aidera à progresser (bien que ce ne soit pas vraiment IP-oriented)


Il faut être super-humble avec sa courbe d'apprentissage à notre âge... :kiki:

Merci.
Et au besoin s'arrêter.
   
[C] Qui est au bout du fil..?
Publié le 04/02/2009 @ 09:19:16,
Par philfr
strace est souvent ton ami.
Si tu te demandes comment fait netstat pour trouver cette info, strace netstat te le dit...
   
[C] Qui est au bout du fil..?
Publié le 04/02/2009 @ 09:57:06,
Par rfr
strace est souvent ton ami.
Si tu te demandes comment fait netstat pour trouver cette info, strace netstat te le dit...


strace est effectivement un ami de longue date. Mais il ne faudrait pas non plus le laisser dans l'ignorance de ce bon vieux ltrace qui permet, en plus des appels système, de tracer les appels à la libc et à d'autres librairies du système.
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
   
[C] Qui est au bout du fil..?
Publié le 04/02/2009 @ 10:32:22,
Par Dr_Dan
j'ai précisé que je parlais de monde Linux?
ah non...voila qui est fait.


Désolé, hier, j'étais dans un trip windows. :petrus: ( ca dépend du client :spamafote: )



strace est effectivement un ami de longue date. Mais il ne faudrait pas non plus le laisser dans l'ignorance de ce bon vieux ltrace qui permet, en plus des appels système, de tracer les appels à la libc et à d'autres librairies du système.


http://upload.wikimedia.org/wikipedia/commons/3/36/Ken_n_dennis.jpg
MAN is the only friend you must have... :tinostar:
:neowen:
Se tromper est humain ; Vraiment foutre la merde necessite le mot de passe de root. :petrus:
   
[C] Qui est au bout du fil..?
Publié le 04/02/2009 @ 12:51:49,
Par blietaer
Mmh bien sur c'est pas lp qui m'intéresse mais rp pour la detection du port server (si je suis client)

Tiens pour tester le joujou, j'utilise netcat, mais dès que je referme le telnet...le serveur netcat saute, on sait pas le faire redémarrer tt le temps?
ou alors j'écris un brol en C qui tient plus longtps?
Et au besoin s'arrêter.
   
[C] Qui est au bout du fil..?
Publié le 04/02/2009 @ 13:04:52,
Par philfr
Pour un client à la fois, tu peux lancer nc dans un while.
Et pour du multiclient, fais ça en python:

#!/usr/bin/env python

import socket
s=socket.socket()
s.bind(("0.0.0.0",2345))
s.listen(5)
l=[]
while 1:
l.append(s.accept())
   
[C] Qui est au bout du fil..?
Publié le 06/02/2009 @ 11:05:16,
Par blietaer
Tiens y a le même genre de /proc file pour "ps -auxww" ?
Et au besoin s'arrêter.
   
[C] Qui est au bout du fil..?
Publié le 06/02/2009 @ 11:59:40,
Par philfr
Tout ce que ps te dit, il le trouve dans /proc/<pid>

/proc/<pid>/status, /proc/<pid>/fd, /proc/<pid>/cwd, /proc/<pid>/cmdline, /proc/<pid>/maps sont sympas, mais tous les autres aussi...
   
[C] Qui est au bout du fil..?
Publié le 06/02/2009 @ 13:09:57,
Par blietaer
OK, donc je devrais refaire le boulot de PS pour avoir une vue de tous les processes...ca sent le execve("ps -auxww")
Et au besoin s'arrêter.
Répondre - Catégorie:  
Informaticien.be - © 2002-2024 AkretioSPRL  - Generated via Kelare
The Akretio Network: Akretio - Freedelity - KelCommerce - Votre publicité sur informaticien.be ?