Avatar billede krismort Nybegynder
06. maj 2007 - 23:18 Der er 4 kommentarer

tjek WAN ip via program

Hej, er der en som kan hjælpe mig med hvordan jeg skriver et program som kan finde ud af hvad WAN ip er, jeg bruger sockets...
Avatar billede arne_v Ekspert
06. maj 2007 - 23:41 #1
et lille hack:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include <windows.h>
#include <errno.h>

int main(int argc,char *argv[])
{
    WSADATA WSAData;
    int sd,status,len,ix,tmp;
    char cmd[512],resp[51200],*p1,*p2;
    struct sockaddr local,remote;
    struct hostent *hostinfo;
    WSAStartup(0x0101,&WSAData);
    sd=socket(AF_INET,SOCK_STREAM,0);
    if(sd<0) {
        printf("Error creating socket: %s\n",strerror(errno));
        goto fin;
    }
    local.sa_family=AF_INET;
    memset(local.sa_data,0,sizeof(local.sa_data));
    status=bind(sd,&local,sizeof(local));
    if(status<0) {
        printf("Error binding socket: %s\n",strerror(errno));
        goto fin;
    }
    hostinfo=gethostbyname("www.myip.dk");
    if(!hostinfo) {
        printf("Error looking up host: %s\n","www.myip.dk");
        goto fin;
    }
    remote.sa_family=hostinfo->h_addrtype;
    memcpy(remote.sa_data+2,hostinfo->h_addr_list[0],hostinfo->h_length);
    *((short *)remote.sa_data)=80;
    tmp=remote.sa_data[0];
    remote.sa_data[0]=remote.sa_data[1];
    remote.sa_data[1]=tmp;
    status=connect(sd,&remote,sizeof(remote));
    if(status!=0) {
        printf("Error connecting to host: %s port: %d\n","www.myip.dk",80);
        goto fin;
    }
    sprintf(cmd,"GET %s HTTP/1.1\r\nHost: %s\r\nwww.myip.dk\r\n\r\n","/","www.myip.dk");
    status=send(sd,cmd,strlen(cmd),0);
    if(status<0) {
        printf("Error sending GET request\n");
        goto fin;
    }
    ix=0;
    while ((len=recv(sd,resp+ix,sizeof(resp)-ix-1,0))>0) {
        ix = ix + len;
    }
    resp[ix]='\0';
    p1=strstr(resp,"<title>Your IP: ");
    p1+=strlen("<title>Your IP: ");
    p2=strstr(p1,"</title>");
    *p2='\0';
    printf("IP=%s\n",p1);
fin:
    closesocket(sd);
    WSACleanup();
    return 0;
}
Avatar billede erikjacobsen Ekspert
06. maj 2007 - 23:56 #2
Eller sagt på en anden måde: det kan man ikke med systemkald som sådan. Der er ikke nogen mulighed for at gå ud bag een, to, eller flere routere, og se hvad deres WAN-adresse er. Men man kan spørge på en tjeneste på nettet, der får WAN-adressen, og som så på en eller anden måde sender den tilbage. Arne bruger www.myip.dk. Det er ikke sikkert den tjeneste er der i morgen/om 7 år. Hvis du skal bruge det til noget seriøst, skal du selv sørge for og vedligeholde din egen IP-nummer-tjeneste - programmeringen er i hvert fald nem ;)
Avatar billede arne_v Ekspert
21. juli 2007 - 16:15 #3
Tid at få afsluttet ?
Avatar billede krismort Nybegynder
22. juli 2007 - 12:06 #4
jeps
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