Avatar billede narrr Nybegynder
17. maj 2004 - 15:00 Der er 9 kommentarer

Angående første parameter i gethostbyaddr()

Hejsa.

Winsocks gethostbyaddr er deklareret sådan her:

struct HOSTENT FAR * gethostbyaddr (
  const char FAR * addr, 
  int len,               
  int type               
);

Den beder altså om en char* som første parameter, men hvorfor er det så at man skal bruge den sådan her:

in_addr n;
n.s_addr = inet_addr("127.0.0.1");
hostent* h = gethostbyaddr((char*)&n, sizeof(in_addr), AF_INET);

Sådan som den er deklareret troede jeg jo at man skulle skrive "127.0.0.1" direkte som første paramter, men det er åbenbart ikke tilfældet! Nogen der kan fortælle mig hvorfor den ikke bare kræver en in_addr* som første param. ?
Avatar billede jakobdo Ekspert
17. maj 2004 - 15:36 #1
Se evt dette eksempel:

#include <iostream>
#include <winsock.h>

int main()
{
  using namespace std;
  WSAData wData;

  if (WSAStartup(MAKEWORD(2,2), &wData) == SOCKET_ERROR)
  {
    cout << "Winsock init error\n";
    return 1;
  }

  hostent *h = NULL;
  char ip[16];

  cout << "Enter Ip: ";
  cin >> ip;

  unsigned int addr;
  addr = inet_addr(ip);

  h = gethostbyaddr(reinterpret_cast<char *>(&addr), 4, AF_INET);
  if (h == NULL)
  {
    cout << "Could not resolve address" << endl;
    return 1;
  }
  cout << "Host: " << h->h_name << endl;

  return 0;
}
Avatar billede narrr Nybegynder
17. maj 2004 - 15:52 #2
Ja, eneste forskel er at du bruger en unsigned int direkte, hvorimod jeg bruger den unsigned int der ligger i in_addr-structen(in_addr::s_addr). Jeg forstår stadig ikke hvorfor gethostbyaddr kræver en char*.
Avatar billede narrr Nybegynder
17. maj 2004 - 15:55 #3
Nej vent lidt.. egentlig bruger jeg en in_addr, hvor du bruger en unsigned int.. hvordan er det muligt?
Avatar billede jakobdo Ekspert
17. maj 2004 - 16:34 #4
Det er et eksempel fundet på nettet!

unsigned int bliver type-castet: reinterpret_cast<char *>(&addr)
Avatar billede narrr Nybegynder
17. maj 2004 - 16:38 #5
Ja, jeg er med på at den bliver type-castet. Grunden til at det både virker med struct in_addr og med unsigned int direkte, er måske at IN_ADDR er deklararet sådan her:
---
struct in_addr {
        union {
                struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
                struct { u_short s_w1,s_w2; } S_un_w;
                u_long S_addr;
        } S_un;
---
Altså som en union. Så hvis jeg smider noget data i s_addr, så indeholder structen ikke andet.. hmm..
Avatar billede narrr Nybegynder
17. maj 2004 - 16:38 #6
Nogen der vil be-/afkræfte?
Avatar billede bertelbrander Novice
17. maj 2004 - 22:55 #7
Om man bruger unsigned int direkte eller in_addr går vel ud på et.

Det undrer mig blot lidt at man så ikke har specificeret at man skal bruge en in_addr, og ikke en char *.

Det kan også undre at man får "network byte order" ved at caste en int til en char *, eller bruge in_addr, jeg troede at "network byte order" var big-endian?
Avatar billede segmose Nybegynder
19. maj 2004 - 10:05 #8
Se http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/gethostbyname_2.asp for hjælp om gethostbyname.

(exemplet får dog ikke mig til at føle at mig sikker på hvad de mener)
Avatar billede narrr Nybegynder
13. august 2005 - 16:35 #9
points anyone?
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