Avatar billede Slettet bruger
06. maj 2006 - 14:17 Der er 20 kommentarer og
1 løsning

Problem med gethostbyaddr

Davs alle sammen:

Jeg har et problem med gethostbyaddr funktionen. Koden herunder virker perfekt, den looper ind til den finder en DNS for at oversætte. Problemet ligger i, hvorfor skal den oversætte den ipaddresse jeg giver den, for at connect vil gennemfører?

Hvis jeg kun skriver dette for at connecte til en anden pc på LAN

server.sin_addr.s_addr = inet_addr("10.13.11.10");

virker det ikke, kun hvis jeg smider den ip ind i koden herunder, som så oversætter med gethostbyaddr. Dog virker det hvis jeg connecter til mig selv..

Det vil altså sige, at jeg ikke kan bruge det her på et nætværk uden DNS eller adgang til internettet, hvorfor?


char* IPAddress = "10.13.11.10";

addr=inet_addr(IPAddress);

while (true)
{
    hp=gethostbyaddr((char*)&addr,sizeof(addr),AF_INET);
    if (hp == NULL)
    {
    cout << "Get host failed..."<<endl;
    Sleep(100);
    }
    else
    break;
}

server.sin_addr.s_addr=*((unsigned long*)hp->h_addr);
server.sin_family=AF_INET;
server.sin_port=htons(Port);
Avatar billede fiil123 Nybegynder
06. maj 2006 - 21:04 #1
Prøv det her:
// Initialize Winsock

WSADATA wsaData; // Et objekt af typen WSADATA kaldet wsadata bliver oprettet

int iResult = WSAStartup( MAKEWORD(2, 2), &wsaData ); // WSAStartup kaldes og retunere en integer og tjekke om der var fejl
if( iResult != NO_ERROR){
       
        cout << "Fejl ved WSAStartup()" << endl;
        status = false;
}

// Creating a Socket

m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

if(m_socket == INVALID_SOCKET )
{
    cout << "Socket fejl " << endl;
    WSACleanup();
    status = false;
   
}

//Connect to server
sockaddr_in clientService;
clientService.sin_family = AF_INET;//Internet adresse familie
clientService.sin_addr.s_addr = inet_addr( "127..0.0.1" );//Ip socket bliver bundet til
clientService.sin_port = htons( 9000 );// Port nummer

if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR)
{
   
    cout << "Kunne ikke oprette forbindelse" << endl;
    WSACleanup();
    status = false;
}
Avatar billede Slettet bruger
07. maj 2006 - 13:12 #2
Tror det er præcis det jeg gør:

void Connect(int Port, char *IPAddress)
{
    char buff[512];
    WSADATA wsaData;
    struct hostent *hp;
    unsigned int addr;
    struct sockaddr_in server;
   
    int wsaret=WSAStartup(0x101,&wsaData);
    if(wsaret)   
    {
        cout << "WSAStartup Error..."<<endl;
        return;
    }
   
    conn=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(conn==INVALID_SOCKET)
    {
        cout << "INVALID SOCKET..."<<endl;
        return;
    }

   
    server.sin_addr.s_addr = inet_addr(IPAddress);
    server.sin_family=AF_INET;
    server.sin_port=htons(Port);

    cout << "Waiting for connection..."<<endl<<endl;
    while (true)
    {
        int Socket = connect(conn,(struct sockaddr*)&server,sizeof(server));
        if(Socket)
        {
            //cout << "Failed to connect!\r\n";   
        }
        else
            break;

    }
    system("cls");
    cout << "Connected to " << IPAddress <<":"<< Port <<endl;
   
}
Avatar billede fiil123 Nybegynder
07. maj 2006 - 13:16 #3
Hmm prøv lige at skriv:
    server.sin_family=AF_INET;
    server.sin_addr.s_addr = inet_addr(IPAddress);

istedet for:
    server.sin_addr.s_addr = inet_addr(IPAddress);
    server.sin_family=AF_INET;
Avatar billede Slettet bruger
07. maj 2006 - 13:21 #4
hmm det ser alligevek ud til at virke nu, uden det sidste du skrev.. oplevede bare på et LAN at den ikke kunne connecte, hva gør gethostbyaddr så?..
Avatar billede fiil123 Nybegynder
07. maj 2006 - 13:25 #5
If no error occurs, gethostbyaddr returns a pointer to the hostent structure.
-------------------------------------------------------------------------------
hostent:
Members

h_name:
Official name of the host (PC). If using the DNS or similar resolution system, it is the Fully Qualified Domain Name (FQDN) that caused the server to return a reply. If using a local hosts file, it is the first entry after the IP address.

h_aliases:
Null-terminated array of alternate names.

h_addrtype:
Type of address being returned.

h_length:
Length of each address, in bytes.

h_addr_list:
Null-terminated list of addresses for the host. Addresses are returned in network byte order. The macro h_addr is defined to be h_addr_list[0] for compatibility with older software.
Avatar billede Slettet bruger
07. maj 2006 - 13:27 #6
dvs den oversætter ip addressen til et hostnavn, hvorfor når den skal connecte (ud i byen)?
Avatar billede fiil123 Nybegynder
07. maj 2006 - 13:35 #7
Det giver heller ikke rigtigt nogen mening for mig... men det er jo heller ikke det du gør nu!
Avatar billede Slettet bruger
07. maj 2006 - 13:39 #8
har lige testet med to PC'r uden internet, kun forbundet via switch, og det virker uden gethostbyaddr, så det er jo helt fint:D..
Avatar billede Slettet bruger
07. maj 2006 - 13:40 #9
kender du forresten en c++ compiler der er nem at bruge?
Avatar billede fiil123 Nybegynder
07. maj 2006 - 13:41 #10
Skulle det bestemt også helst...
Avatar billede Slettet bruger
07. maj 2006 - 13:42 #11
kender du forresten en c++ compiler der er nem at bruge?
Avatar billede fiil123 Nybegynder
07. maj 2006 - 13:43 #12
Altså jeg har lært C++ gennem mit studie og der bruger vi Microsoft Visual Studio 2005. Det er et udviklingsværktøj jeg er utrolig glad for at arbejde med!
Avatar billede Slettet bruger
07. maj 2006 - 13:45 #13
jep dte bruger jeg netop også, men jeg vil forsøge at få mit program til at virke på en PC UDEN dotnet, det er jo netop hvad c++ burde kunne right?.. men compiler i VS2005, og der siger den "forkert programkonfiguration" når jeg kører det på en ren xp installation med sp2?
Avatar billede fiil123 Nybegynder
07. maj 2006 - 13:51 #14
det er fordi at Microsoft i 2005 udgaven har lavet noget rod med nogle DLL filer der er 2 løsninger:
1:
Ved mig er stien: C:\Programmer\Microsoft Visual Studio 8\VC\redist! Den burde være nogenlunde det samme for dig (på den com. hvor VS 2005 er installeret) Derinde er der dll-filer som kan få det til at virke!

2:
Den nemmere metode er at ændre nogle projekt properties!
I vs for projektet:
project->properties(ALT+F7)
configuration properties -> C/C++->
C/C++ -> Code generation.
I vinduet til højre ændre du "Runtime library" fra "Multi-threaded Debug DLL (/MDd)" til "Multi-threaded Debug (/MTd)"

Det er pga at der er knyttet nogle dll filer til projektet ved løsning 2 bliver de inkluderet i exe filen så den vil ved løsning 2 også blive større(min. 600 KB mener jeg)
Avatar billede Slettet bruger
07. maj 2006 - 14:49 #15
gjorde som du sagde i 2: den giver mig denne fejl:

Error    1    fatal error C1189: #error :  Please use the /MD switch for _AFXDLL builds    C:\Programmer\Microsoft Visual Studio 8\VC\atlmfc\include\afxver_.h    77
Avatar billede fiil123 Nybegynder
07. maj 2006 - 14:52 #16
Så skal du ind og have de DLL filer med som i 1
Avatar billede Slettet bruger
07. maj 2006 - 16:03 #17
hmm læste mig frem til man kunne smide det her ind i stdafx.h:

#undef _AFXEXT
#undef _AFXDLL

og rigtig nok så compiler den, men så fylder min exe 1.4 MB :O fra 12.5 kb
Avatar billede fiil123 Nybegynder
07. maj 2006 - 16:04 #18
hehe oki... men det er nok de DLL filer der bliver smidt i exe filen så
Avatar billede Slettet bruger
07. maj 2006 - 16:05 #19
ja, men hvis jeg nu compiler med en anden ikke Visual studio compiler, kan jeg så løse problemet?
Avatar billede fiil123 Nybegynder
07. maj 2006 - 16:06 #20
Det tror jeg ikke men aner det faktisk ikke for at være ærlig
Avatar billede Slettet bruger
07. maj 2006 - 16:06 #21
nå okay, jeg må forsøge mig lidt.. tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester