Member 13616463 Ответов: 2

Как использовать localhost IP с getaddrinfo()


#include<string>
#include<string.h>
#include<iostream>
#include<fstream>
#include<sys/types.h>
#include<stdio.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include<string.h>
#include<arpa/inet.h>
#include<iostream>
#include<cerrno>
#include<cstring>
#include<netdb.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>

using namespace std ;


int main(int argc, char **argv)
{
    int socketfd ;  // create socket

  //create connection with the server (using sample server.cpp file so
using same struct)
    struct addrinfo hints, *servinfo, *p  ;

    memset (&hints, 0, sizeof hints);

  //serveradder.sin_family = AF_INET;
  //serveradder.sin_port = htons(4000);     // short, network byte order
     //serveradder.sin_addr.s_addr = inet_addr("127.0.0.1");
  //memset(serveradder.sin_zero, '\0', sizeof(serveradder.sin_zero));

  // parseUrl(argv[1]);

  hints.ai_family  = AF_UNSPEC; // allow IPv4 or IPv6
  hints.ai_socktype = SOCK_STREAM ;
  hints.ai_flags = 0; //
  hints.ai_protocol = 0 ; // Any protocol

int s =  getaddrinfo( "www.facebook.com", "http", &hints, &servinfo )
; // first 2 arguments will be argv[1] and argv[2]

// connect() not working when specifying localhost or 127.0.0.1 as the
first argument.
// Works well when specifying "www.google.com"


// cout << "s is " << s ;  // working fine till here, gives 0. Used to
debugging.

// getaddrinfo returns a list of address structures.
// Try each address until we successfully connect.



if ( s!=0 ) {
  cout<< stderr << "getaddrinfo: " << gai_strerror(s) << "\n" ;
    return 0;
//exit(EXIT_FAILURE) ;
}

int x ;

for ( p = servinfo ; p!=NULL ; p = p->ai_next ) {

  socketfd  = socket(AF_INET, SOCK_STREAM, 0); cout<< "socketfd is "
<< socketfd << endl;

  if ( socketfd == -1  ) {
    continue;
  }

x = connect(socketfd, servinfo->ai_addr, servinfo->ai_addrlen) ;

  if ( x!= -1 ) {
     cout<<"Success" << endl;
     break; // Success
  }

// cout << "x is :" << x << endl ;

  close(socketfd) ;

}


  struct addrinfo *clientAdder = servinfo;  // Doubt: Should I
initialize this to servinfo ?

  //socklen_t lengthCAdd = sizeof(clientAdder);

  int getnameerr = getsockname(socketfd, clientAdder->ai_addr,
&clientAdder->ai_addrlen);

  if(getnameerr == -1){
    cout << "failed to get socket name" << endl;
    return 3;
  }


  struct sockaddr_in *s1 = (struct sockaddr_in *)clientAdder->ai_addr ;

  char ipaddress[INET_ADDRSTRLEN] = {'\0'};

  inet_ntop( s1->sin_family, &s1->sin_addr, ipaddress, sizeof(ipaddress) );

  cout << "Setting up connection from: " << ipaddress << ":" <<
ntohs(s1->sin_port) << endl;

}


Что я уже пробовал:

Как я могу использовать localhost IP или просто "localhost" с функцией getaddrinfo ()? Он прекрасно работает, когда я использую "www.google.com" в качестве первого аргумента, но дает ошибку при использовании "127.0.0.1".

Я также хочу знать, правильно ли я использовал getsockname ()?

Richard MacCutchan

Какая ошибка?

Member 13616463

Когда я использую "127.0.0.1" в качестве первого аргумента getaddrinfo(), он печатает не удалось получить имя сокета.
При использовании "www.google.com" он печатает установку соединения от...

2 Ответов

Рейтинг:
1

Richard MacCutchan

Вам нужно проверить возвращенный код ошибки, чтобы выяснить, почему он не работает. Видеть функция getaddrinfo (ws2tcpip.h) | Microsoft Docs[^].


Рейтинг:
1

Shao Voon Wong

Если вы хотите использовать IP-адрес, вы должны использовать inet_pton[^]

Когда вы используете URL-адрес домена, например www.google.com, он должен перейти на DNS-сервер, чтобы получить фактический IP - адрес. С IP-адресом это не требуется.