Quote:
Originariamente inviato da 17Qwerty71
E' possibile passare in sin_addr l'identificativo del pc della rete locale invece dell'ip? 
|
Assolutamente no. inet_addr poi non può essere usata nel modo detto da Fenomeno85 (inet_addr prende come parametro una stringa contenente l'ip in notazione puntata).
Se vuoi ottenere l'indirizzo ip del server su cui connettersi tramite il suo nome DNS si usa la funzione
struct hostent* FAR gethostbyname(
const char* name
);
Per comodità metto anche la struttura hostent:
typedef struct hostent {
char FAR* h_name;
char FAR FAR** h_aliases;
short h_addrtype;
short h_length;
char FAR FAR** h_addr_list;
} hostent;
(tutti quei FAR sono definiti in Win, fai conto che non ci sono).
In più in winsock2.h è definita, per retrocompatibilità:
#define h_addr_list[0] h_addr
Ad esempio puoi fare:
Codice:
struct sockaddr_in clientSin;
struct hostent *server;
char serverName[20];
...
// Non alloco memoria per '*server', dal momento che la struttura
// viene allocata dalla funzione...
strncpy(serverName, "www.google.it", 20);
server = gethostbyname(serverName);
...
// Se tutto è andato bene, ora in '*server' ho, tra le altre cose, la
// lista di indirizzi IP associati al nome host www.google.it.
// Ad esempio, per prendere il primo:
clientSin.sin_addr = *((struct in_addr *)server->h_addr_list[0]);
// Potevo anche fare:
// clientSin.sin_addr = *((struct in_addr *)server->h_addr);
Volendo puoi anche usare la seguente funzione:
int getaddrinfo(
const char* nodename,
const char* servname,
const struct addrinfo* hints,
struct addrinfo** res
);
Per il suo uso ti rimando alla MSDN (o alla manpage di Linux indifferentemente).
Se invece vuoi risolvere gli ip tramite il nome NetBios del PC (il nome di Windows per intenderci) ovviamente lo puoi fare solo in rete locale, quando non hai un server DNS in LAN oppure la tua lan non è collegata al DNS mondiale (sennò usi gethostbyname tranquillamente). Per quello non ricordo cosa si usa, poso controllare (sarà qualche funzione esclusiva di winsock2).
EDIT: penso puoi provare questa funzione per sapere l'ip tramite il nome NetBios:
NET_API_STATUS NetWkstaTransportEnum(
LPWSTR servername,
DWORD level,
LPBYTE* bufptr,
DWORD prefmaxlen,
LPDWORD entriesread,
LPDWORD totalentries,
LPDWORD resumehandle
);
definita in <Lm.h>
Consulta al solito MSDN per il suo uso (cmq alla fine in *bufptr hai tutte le info che ti servono, incluso l'ip).
EDIT 2: Però mi sta venendo un'idea: prova a passare a gethostbyname il nome Netbios del pc a cui collegarti invece del nome DNS, magari funziona lo stesso! Ovviamente devi anteporre "\\" al nome (ad esempio se il pc si chiama MioPc, devi fare gethostbyname("\\MioPc"). E' possibile che la gethostbyname con macchine Windows si comporti in modo "esteso", magari hai una bella sorpresa!
Quando posso provo anch'io.