Question

Je suis en train de réaliser la communication entre pairs en utilisant Winsock mais gethostbyaddr toujours me retourner NULL, cette chose ne fonctionne que sur localhost, nom_serveur est l'adresse IP de destination

server_name="<--ipaddress-->"

struct sockaddr_in server;
addr = inet_addr(server_name);
cout<<"inet_addr(server_name) "<<addr<<endl;
hp = gethostbyaddr((char *)&addr, 4, AF_INET);
memset(&server, 0, sizeof(server));


memcpy(&(server.sin_addr), hp->h_addr, hp->h_length);
server.sin_family = hp->h_addrtype;
server.sin_port = htons(port);
conn_socket = socket(AF_INET, socket_type, 0); 

connect(conn_socket, (struct sockaddr*)&server, sizeof(server))

Nous avons déjà réalisé la communication p2p utilisant python et il fonctionne parfaitement bien sur le même port non et adresse .. merci pour tout indice ..

Je n'ai aucune idée comment le faire en C ++, en python nous bind utilisé (---), quelqu'un peut me montrer extrait de code comment y parvenir.

Était-ce utile?

La solution

Où êtes-vous server_name de? Etes-vous sûr qu'il est une adresse IP valide? En outre, vérifiez WSAGetLastError() pour voir précisément ce qui ne va pas.

Rappelez-vous que tous les noms d'hôtes ont inversé les entrées DNS. Il est tout à fait légitime pour gethostbyaddr échouer sur une réelle adresse IP valide. Si vous faites p2p, il est préférable de ne pas compter sur l'hôte noms du tout, sauf peut-être pour les écrans de diagnostic (et revenir à des adresses IP si la résolution inverse FAIL).

Modifier . Avec votre nouveau exemple de code élargi, il est clair que vous n'avez pas réellement besoin gethostbyaddr du tout

struct sockaddr_in server;
memset((void*)&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.S_un.S_long = inet_addr(server_name);
server.sin_port = htons(port);
conn_socket = socket(AF_INET, socket_type, 0); 

connect(conn_socket, (struct sockaddr*)&server, sizeof(server))

gethostbyaddr est nécessaire uniquement lorsque vous avez besoin du DNS inverse nom du serveur en question. inet_addr vous donne déjà une adresse appropriée pour se connecter.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top