Newsgroup: it.comp.os.linux.development
Titolo: trovare ip

Salve,
ho bisogno di scrivere una routine in c che mi dice quale è l'ip della 
connessione che sto usando.
Tanto per capirci, ho una procedura che gira in una finestra telnet o ssh e 
all'interno della procedura devo sapere l'ip usato dalla connessione telnet 
stessa.
C'è una qualche chiamata di sistema che me lo dice o avete una idea di come 
fare?
grazie
Ioson

 telnet stessa.
Se sei in una session SSH, la variable d'ambiente SSH_CLIENT contiene l'IP e
la porta dell'altro estremo della connessione. Quindi sei a posto.
In una sessione telnet, invece, è possibile (ma non garantito, credo) che
sia definita la variabile d'ambiente REMOTEHOST. Verifica sul tuo sistema.
Max

 sia definita la variabile d'ambiente REMOTEHOST. Verifica sul tuo sistema.
per SSH ho controllato e infatti, come dicevi, SSH_CLIENT funza.
Per telnet però non ho trovato REMOTEHOST...
purtroppo per me è il caso più frequente...
altre idee?
Grazie 1000 e ciao
Ioson 

 
  who -m
M


Potresti adattare un prg tipo quello sotto per impostare subito una var 
d'ambiente con l'IP non appena sei connesso con il telnet (nb. un 
sistema del genere non funziona sempre: p.e. sotto particolari 
interfacce tipo screen, mc, ecc...).
Il metodo e' lo stesso proposto da Max M. (who -m), ma in questo modo si 
ottiene anche l'IP (quando c'e') oltre all'hostname (che dovrebbe essere 
un nome a dominio o contiene addirittura altro).
(l'ho scritto in una decina di min e ho fatto pochi test - prova se va bene)
Ciao
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <utmp.h>
int main(void)
{
	const char * const p_basedev = "/dev/";
         char *p_tty, szIP[30];
	struct utmp utmp, *p_utmp;
	errno = 0;
	memset(&utmp, 0, sizeof(utmp));
 
	if(!(p_tty =  ttyname(0)))
	{	perror("Errore in ttyname");
     		return errno;
	}
 
	/* printf("-- tty = %s\n", p_tty); */
 
	if(0 != strncmp(p_basedev, p_tty, strlen(p_basedev)))
	{	fprintf(stderr, "Errore: device path imprevisto.\n");
     		return -1;
	}
	snprintf(utmp.ut_line, sizeof(utmp.ut_line), "%s", p_tty + 
strlen(p_basedev));
	/* printf("-- utmp.ut_line = %s\n", utmp.ut_line); */
	setutent();
	if(!(p_utmp = getutline(&utmp)))
     	{	perror("Errore in getutline");
     		return errno;
	}
	szIP[0] = '\0';
	if(p_utmp->ut_addr_v6[0])
		snprintf(szIP, sizeof(szIP), "%d.%d.%d.%d",
			p_utmp->ut_addr_v6[0] & 0xff,
			(p_utmp->ut_addr_v6[0] >> 8) & 0xff,
			(p_utmp->ut_addr_v6[0] >> 16) & 0xff,
			(p_utmp->ut_addr_v6[0] >> 24) & 0xff
		);
	printf("IP: %s - Hostname: %s - User: %s\n", szIP, p_utmp->ut_host, 
p_utmp->ut_user);
	return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 ha scritto nel messaggio
news:eo3vfi$qvb$1...@newsreader.mailgate.org...


Purtroppo utmp.h che ho non ha ut_addr_v6
dal manuale...
(che sfiga...)
Grazie
utmp(F)
----------------------------------------------------------------------------
----
utmp, wtmp -- user and accounting information
Synopsis
   #include <utmp.h>
Description
These files, which hold user and accounting information for such commands as
who, write, and login, have the following structure, defined in utmp.h:
   #define UTMP_FILE   "/var/adm/utmp"
   #define WTMP_FILE   "/var/adm/wtmp"
   #define ut_name     ut_user
The utmp structure includes the following members:
      char    ut_user[8];        /* user login name */
      char    ut_id[4];          /* /etc/inittab id (created by */
                                 /* process that puts entry in utmp) */
      char    ut_line[12];       /* device name (console, lnxx) */
      short   ut_pid;            /* process id */
      short   ut_type;           /* type of entry */
      struct  exit_status {
         short  e_termination;   /* process termination status */
         short  e_exit;          /* process exit status */
      } ut_exit;                 /* exit status of a process
                                 * marked as DEAD_PROCESS */
      time_t  ut_time;           /* time entry was made */
   /*  Definitions for ut_type  */
   #define EMPTY         0
   #define RUN_LVL       1
   #define BOOT_TIME     2
   #define OLD_TIME      3
   #define NEW_TIME      4
   #define INIT_PROCESS  5       /* process spawned by "init" */
   #define LOGIN_PROCESS 6       /* a "getty" process waiting for login */
   #define USER_PROCESS  7       /* a user process */
   #define DEAD_PROCESS  8
   #define ACCOUNTING    9
   #define UTMAXTYPE     ACCOUNTING  /* max legal value of ut_type */
   /*  Below are special strings or formats used in the "ut_line" */
   /*  field when  accounting for something other than a process.  */
   /*  No string for the ut_line field should be no more than 11 chars +  */
   /*  a null character in length.  */
   #define RUNLVL_MSG     "run-level %c"
   #define BOOT_MSG       "system boot"
   #define OTIME_MSG      "old time"
   #define NTIME_MSG      "new time"
Files
/var/adm/utmp
/var/adm/wtmp
References
login(C), utmpx(F), who(C), write(C)


 dal manuale...
beh, potevi dirlo che non usavi Linux :)
cos'hai: irix, solaris,...?


Scusa hai ragione, sto modificando una applicazione per SCO Openserver.
Ho scritto qui perchè fino ad oggi, forse per fortuna, non ho mai
riscontrato differenze del genere.
oltretutto sto facendo il porting su linux (ovviamente) e per un po' dovro
tenerle entrambe.
Uso costantemente le librerie tcp, e differenze non ne ho trovate tra le
librerie SCO e linux.
Anche se ne faccio un uso molto "standard".
Pero, dico io, ci sarà una chiamata al sistema, da qualche parte che mi dice
l'ip assegnato ad una tty?
altrimenti netstat  oppure finger come fanno a farlo?
Grazie
Ioson
"Cybertoldo" <cyber...@moc.liamg> ha scritto nel messaggio
news:eo5j2r$759$1...@registered.motzarella.org...
