Newsgroup: it.comp.programmare.win32
Titolo: Indirizzo IP

Buongiorno a tutti.
Devo sviluppare una piccola applicazione in cui ho la necessità di leggere
l'indirizzo IP della postazione in uso.
Come si può fare utilizzando VC++?
Grazie anticipatemente.

 ha scritto nel messaggio
news:93n469$lqj$1...@lacerta.tiscalinet.it...

Ciao,
io ho scritto questa funz. per un progr. C++ Builder, comunque puoi
adattarla facilmente al VC++
String GetIP(){
  in_addr *pptr[10];
  hostent *phe;
  char Buffer[63];
  LPWSADATA GInitData;
  String sIP = "";
  int I;
  try{
    GInitData = (LPWSADATA)malloc(sizeof(WSAData));
    WSAStartup(0x101, GInitData);
    gethostname(Buffer, sizeof(Buffer));
    phe = gethostbyname(Buffer);
    if(!phe){
      free(GInitData);
      return sIP;
    };
    pptr[0] = (in_addr*)phe->h_addr_list[0];
    I = 0;
    while(pptr[I]){
      sIP = inet_ntoa(*pptr[I]);
       I++;
    };
    WSACleanup;
    free(GInitData);
  }catch(...){};
  return sIP;
};

 wrote in message
news:64J76.33556$eB2.3...@news.infostrada.it...


void Main()
int main()
Il C e' case-sensitive e la forma void e' illegale.
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

 writes:
I> Ti ringrazio per l'aiuto.
I> Io ho provato con il codice seguente, ma quando eseguo il linking mi da:
I> Linking...
I> getIp.obj : error LNK2001: unresolved external symbol _WSACleanup@0
I> getIp.obj : error LNK2001: unresolved external symbol _inet_ntoa@4
I> getIp.obj : error LNK2001: unresolved external symbol _gethostbyname@4
I> getIp.obj : error LNK2001: unresolved external symbol _gethostname@8
I> getIp.obj : error LNK2001: unresolved external symbol _WSAGetLastError@0
I> getIp.obj : error LNK2001: unresolved external symbol _WSAStartup@8
Qui  non  è  stata  indicato  al  linker  che  deve  utilizzare  anche
wsock32.lib per il link. 
I> LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol
I> _WinMain@16
I> Debug/getIp.exe : fatal error LNK1120: 7 unresolved externals
I> Error executing link.exe.
E qui si cerca di compilare un eseguibile da console come applicazione a
finestra...
\begin{echelon}
[Hello to all my fans in domestic surveillance] smuggle North Korea
quiche Noriega Waco, Texas World Trade Center nuclear Legion of Doom
Panama explosion assassination Ft. Bragg Rule Psix SDI
\end{echelon}
\begin{avviso}
 
Attenzione: Leggersi lo header riguardo al mio e-mail!
Warning: read header for infos about my e-mail.
\end{avviso}
--
+----------------------------------------------------------------+
| Gian Uberto Lauri * "So, are you working on fixing that bug    |
| 
sa...@eng.it
      *  *now* or leaving it until later ?" - YES  |
+----------------------------------------------------------------+

viene accettata anche dal VC++ 6.0, mentre il gcc si limita ad un warning.
No. 
Gli standard C99 e ISO 97 dei rispettivi C e C++ non prevedono il
non-tipo void come valore di ritorno di main.
L'uso corretto del valore di ritorno e' int (e **SOLO** questo).
Vienici a trovare su it.comp.lang.c o it.comp.lang.c++ e/o consulta le
faq di comp.lang.c per un'ulteriore conferma.


 wrote in message
news:lrfu5tcu2qjmcs3tv...@4ax.com...


 viene accettata anche dal VC++ 6.0, mentre il gcc si limita ad un warning.
c'è una certa differenza tra dire che "un compilatore non segue uno
standard" e dire "il compilatore definisce lo standard".
in questo caso è il compilatore che non segue lo standard
lo standard dice che main deve ritornare un numero
--
ciao
XAERO [*]
"Se vuoi renderti conto del valore del
denaro, prova a chiedere un prestito"
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCA/CM/CS/CC/E/O d?(-) s+:-- a--->? C++++(+)$@ UL-(--) P>++ L+() E-- W+++$@
N++@ o-- K- w+++(++++)@ O--- M V? PS+++ PE-(--) Y? PGP>++ t? 5? X+ R- tv-
b+(++) DI? D++ G- e !h !r y?
------END GEEK CODE BLOCK------

 writes:
AL> Gli standard C99 e ISO 97 dei rispettivi C e C++ non prevedono il
AL> non-tipo void come valore di ritorno di main.
Grazie e mille dell'info Andrea.
Sinceramente mi  lascia scettico sulla reale utilità  di metterlo come
standard  ISO, dato  che il  return code  di main()  è  ignorato nella
stragrande  maggioranza   dei  casi,   mi  suona  tanto   di  zucchero
sintattico, non di una cosa fondamentale.
/*
	Nota storica : l'uso di void come tipo di main() serviva
	sotto alcuni sistemi, insieme all'uso di _main() al posto
	di main(), tra le tecniche per ridurre le dimensioni dei
	compilati...
*/
\begin{echelon}
DES assassination Ft. Meade FSF cryptographic nuclear Soviet
fissionable ammunition counter-intelligence plutonium Noriega $400
million in gold bullion strategic Honduras


sintattico, non di una cosa fondamentale.
No. E' fondamentale, invece.
Ci sono piattaforme in cui il void main genera dei veri e propri
crash. Il return code di main non viene ignorato su molti sistemi e
cio' autorizza ad inserire come regola di portabilita' quella del
valore di ritorno "int".


 propri crash.
Puoi fare un esempio? Piu` che un problema di piattaforma mi sembra un
problema di compilatore, non e` che definire main() come void porti
necessariamente ad avere puntatori errati o comportamenti indeterminati.
Anche sotto a DOS/Windows i programmi restituiscono *sempre* un codice
di ritorno, che tu glielo fornisca o meno; se non lo fai tu attraverso
il main, ci pensa il codice stub a farlo al posto tuo.
---
Bye! Lorenzo Lutti
http://antani.virtualave.net/

il main, ci pensa il codice stub a farlo al posto tuo.
Non e' questo il problema, il problema e' come e' definita la funzione
main. E' vero, tra l'altro, che il C++ assume come standard il
comportamento che citi, per cui si puo' evitare di restituire un
valore alla fine, perche' il compilatore lo fa al posto tuo.
Ma e' importante definire main con valore di ritorno int.


Question 11.15
Scusate, ho dimenticato di dire che queste sono le FAQ di comp.lang.c,
dove si e' spesso discusso di questo argomento.


 writes:
AL> Ci sono piattaforme in cui il void main genera dei veri e propri
AL> crash.
Sinceramente : quali ?
Il  return code di  main() ha  precise ragioni  storiche per  un certo
insieme di programmi. Ora alcuni  sistemi vanno in palla se main() non
ritorna  un ritorna  nulla. Mettere  il tipo  int() come  standard per
tutti mi pare tanto ostinarsi ad andare ai 30 orari in un autostrada a
3 corsie rettilinea e deserta :)
--
Gian Uberto| main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Lauri      |                        David Korn, 1987 ioccc best one liner 
(aka saint)|-------------------------------------------------------------------
em@ail: sierra alfa india november tango AT echo november golf DOT india tango

3 corsie rettilinea e deserta :)
Il return code di main deve essere int per ragioni di portabilita'.
Anche se in questo caso, onestamente, si va oltre i semplici problemi
di portabilita', perche' il comportamento di un main senza tipo di
ritorno e' del tutto indefinito (e quindi, secondo lo standard, si
puo' anche formattare l'hard disk).


 di chiamata.
La considerazione e` giusta (tutto il problema dipende ovviamente dalla
pessima caratteristica del C di permettere di chiamare funzioni non
dichiarate). Cio` che dicevo, e che ribadisco tutt'ora, e` che il
compilatore sarebbe perfettamente in grado di gestire il caso
eccezionale rappresentato dal main(). Quindi non si puo` dire che "sotto
a certe piattaforme causa crash", ma piuttosto "certi compilatori sono
pietosi, e non sanno gestire void main()".


 puo' anche formattare l'hard disk).
Insisto: questi sono sofismi. Seguendo questa logica, si dovrebbe
definire anche la semantica del codice di ritorno del main; ma questo e`
ovviamente impossibile, e` una di quelle tipiche cose talmente
dipendenti dalla piattaforma che non possono essere standardizzate.
Quindi rilancio e strozzo con un carico da undici: definire main come
void e` molto meglio che definirlo come int. In questo modo infatti si
delega al compilatore e al codice stub (che sono *specifici* di ogni
piattaforma, e quindi ne conoscono le convenzioni) la restituzione di un
codice di ritorno di default appropriato per tale piattaforma.


pietosi, e non sanno gestire void main()".
Sotto certe piattaforme, istruzioni di quel tipo generano crash.
Che tu ci creda o meno, non fa differenza.
I compilatori standard, che non sono affatto pietosi, gestiscono main
per come essa DEVE essere dichiarata.
E' lo standard che detta legge, non l'implementazione.


void e` molto meglio che definirlo come int.
Ribadisci cose sbagliate e di questo mi dispiace.
Se non vuoi credere a cio' che dico, fatti assumere dai comitati di
standardizzazione ANSI/ISO e fai valere i tuoi punti di vista.
Io ti dico che cosa dice lo standard OGGI e come vanno fatte le cose,
per essere nella regola.


> 3 corsie rettilinea e deserta :)
AL> Il return code di main deve essere int per ragioni di portabilita'.
Il  C portabile  è un  po' una  utopia. Principalmente  perché  non ho
ancora visto un programma C  realmente utile che non utilizzi chiamate
a sistema. E quelle non sono portabili :).
Definirlo come  standard, ti ripeto, mi pare  un'esagerazione. Non una
cosa  sbagliata,  ma  un  esagerazione.   Magari  in  qualche  caso  è
_necessario_, ma non in tutti.
Parlando con la mia lei (che si  è stancata di scrivere codice e fa la
sistemista) devo riconoscere che è venuta meno la ragione di difendere
il void... Ovvero la pigrizia. Già, basta scrivere 
main()
{}
e questo sarà int :)


 writes:
AL> Il C non permette l'esecuzione di funzioni non dichiarate.
AL> Gli ultimi standard non lo consentono.
AL> Se il tuo compilatore te lo fa fare, allora e' fuori standard.
Per Allah! :) Ma sei diventato un fondamentalista degli standard :) :).
Mi auguro  che ci sia una  differenza tra i tecnici  dell'ISO e quelli
dell'U.S. Patent Office :)


dell'U.S. Patent Office :)
Eh certo, il primo e' International !
:)


e questo sarà int :)
Sbagliato. E' fuori standard.
Lo standard ISO non ammette piu' questa forma.
Bisogna sempre specificare il valore di ritorno di main e questo deve
essere "int".


> dell'U.S. Patent Office :)
AL> Eh certo, il primo e' International ! :)
Occhio che  i secondi hanno  brevettato _due_volte_ il  "carello della
spesa" usato in molti siti di e-commerce :)


 writes:
AL> Sbagliato. E' fuori standard.
Vado a cercarmi i flag per il K&R mode, sto' standard rompe :)


spesa" usato in molti siti di e-commerce :)
Allora e' vero che e' brevettato ? da Amazon ?
Ma che significa, che bisogna pagare i diritti ?


> spesa" usato in molti siti di e-commerce :)
AL> Allora e' vero che e' brevettato ? da Amazon ?
AL> Ma che significa, che bisogna pagare i diritti ?
Ecco i brevetti per il carrello della spesa:
US0610182 della IBM
US5960411 della Amazon
Sono visibili in 
http://www.patents.ibm.com
Altre cose  carine brevettate :  LZW, algoritmo di  compressione delle
GIF (usate PNG!), tracciamento dei crosshair cursor con lo xor.
I brevetti sono validi solo per  gli Stati Uniti. In Europa al momento
non sono  validi né è brevettabile  il software. Credo  che ai piccoli
sviluppatori  interessi   mantenere  la  situazione   attuale  di  non
brevettabilità, vedi:
http://petition.eurolinux.org/index_html?LANG=it
