Sujet: [C] Qui est au bout du fil..?
03/02/2009 @ 16:47:07: blietaer: [C] Qui est au bout du fil..?
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
03/02/2009 @ 16:56:28: Dr_Dan: [C] Qui est au bout du fil..?
Tcpview de sysinternals.. :petrus:
http://technet.microsoft.com/en-us/sysinternals/default.aspx
03/02/2009 @ 17:16:08: blietaer: [C] Qui est au bout du fil..?
j'ai précisé que je parlais de monde Linux?
ah non...voila qui est fait.
03/02/2009 @ 17:20:08: philfr: [C] Qui est au bout du fil..?
Sous linux ?

Edith: ah, ok...

Parser le fichier /proc/net/tcp est la solution...
03/02/2009 @ 17:25:40: blietaer: [C] Qui est au bout du fil..?
GENIAL !
03/02/2009 @ 17:35:27: philfr: [C] Qui est au bout du fil..?

#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);
}
}
}
}
03/02/2009 @ 18:03:04: blietaer: [C] Qui est au bout du fil..?
:prosterne:
03/02/2009 @ 23:02:56: philfr: [C] Qui est au bout du fil..?
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.
04/02/2009 @ 09:11:42: blietaer: [C] Qui est au bout du fil..?
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.
04/02/2009 @ 09:19:16: philfr: [C] Qui est au bout du fil..?
strace est souvent ton ami.
Si tu te demandes comment fait netstat pour trouver cette info, strace netstat te le dit...
04/02/2009 @ 09:57:06: rfr: [C] Qui est au bout du fil..?
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.
04/02/2009 @ 10:32:22: Dr_Dan: [C] Qui est au bout du fil..?
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:
04/02/2009 @ 12:51:49: blietaer: [C] Qui est au bout du fil..?
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?
04/02/2009 @ 13:04:52: philfr: [C] Qui est au bout du fil..?
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())
06/02/2009 @ 11:05:16: blietaer: [C] Qui est au bout du fil..?
Tiens y a le même genre de /proc file pour "ps -auxww" ?
06/02/2009 @ 11:59:40: philfr: [C] Qui est au bout du fil..?
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...
06/02/2009 @ 13:09:57: blietaer: [C] Qui est au bout du fil..?
OK, donc je devrais refaire le boulot de PS pour avoir une vue de tous les processes...ca sent le execve("ps -auxww")
Retour