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

Qualcuno mi ha detto di utilizzare il seguente codice per rilevare
l'indirizzo IP del mio client da un eseguibile (console) in C++:
#include <iostream>
#include <winsock.h>
using namespace std;
void main()
{
 HOSTENT* host;
 char* szBuffer = new char[250];
 gethostname(szBuffer, 250);
 host = gethostbyname(szBuffer);
 //    Ora gli indirizzi IP della macchina sono memorizzati nella struttura
*host
 //    di conseguenza il primo indirizzo IP è ottenuto tramite:
 cout << host->h_addr_list[0];
 delete szBuffer;
}
In fase di compilazione non restituisce ne errori ne warnings... ma in
building dell'eseguibile ricevo il seguente messaggio:
--------------------Configuration: IndirizzoIP - Win32
Debug--------------------
Linking...
main.obj : error LNK2001: unresolved external symbol _gethostbyname@4
main.obj : error LNK2001: unresolved external symbol _gethostname@8
Debug/IndirizzoIP.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
IndirizzoIP.exe - 3 error(s), 0 warning(s)
Cosa può essere? Dove sbaglio?
Grazie mille a tutti.

 Cosa può essere? Dove sbaglio?
perchè devi linkare la libreria Ws2_32.lib
(Project->Settings->Link)
--
ciao
xaero


wrote:


 wrote in message
1ttcjtcjdb8esu9bk...@4ax.com...


> > delete szBuffer;
va riscritto in :
delete [] szBuffer ;
Se non ricordo male, secondo lo standard ISO C++, la tua
espressione conduce a un "undefined behavior".

Allora...
il problema non e' assolutamente dovuto alle righe di codice mensionate...
tant'e' vero che anche modificandole non cambia niente.
Se commento invece la riga "cout << host->h_addr_list[0];" non ricevo nessun
errore... quindi deduco che c'e' qualcosa che non va durante l'accesso alla
struttura tramite puntatore... ma non capisco perche'!
Non era a conoscenza della tua aggiunta sulla delete... ma non sono pero'
daccordo su quanto hai detto per l'illegalita' di void al posto di int. Il
manuale da cui sto studiando non e' daccordo!
Se davvero questa cosa riesce a funzionare... avevo in mente di creare una
specie di "NET SEND" da prompt. Giusto per fare qualche esercizio. Credete
sia complicato per me? Cosa mi occorrerebbe?
Ciao.
Andrea Laforgia <xx...@xxxxx.xxx> wrote in message
6rdhjtcjfrftpeb84...@4ax.com...


 Potreste aiutarmi?
l'errore è nel modo in cui leggi l'ip.
host->h_addr_list è un'array di char, ma non va interpretata come
una stringa C. devi leggere i valori (che sono sempre 4, cmq
verifichi la lunghezza da host->h_length) e formattarli tu in modo
che l'ip venga visualizzato nel modo a.b.c.d.
ecco un programmino di esempio funzionante:
#include <iostream>
#include <Winsock2.h>
using namespace std;
int main()
{
WSADATA wsa;
WSAStartup(MAKEWORD(1, 0), &wsa);
char* szBuffer = new char[250];
TCHAR *lpIPAddr = new TCHAR[250];
if(gethostname(szBuffer, 250) != 0)
    return 0;
struct hostent * host = gethostbyname(szBuffer);
wsprintf(lpIPAddr, "IP Locale: %d.%d.%d.%d\n",
    (BYTE)host->h_addr_list[0][0],
    (BYTE)host->h_addr_list[0][1],
    (BYTE)host->h_addr_list[0][2],
    (BYTE)host->h_addr_list[0][3]);
cout << lpIPAddr;
delete[] szBuffer;
delete[] lpIPAddr;
WSACleanup();
return 0;
}

 wrote in message
9hc080$dft4r$1...@ID-51253.news.dfncis.de...
