Avatar billede benjax Nybegynder
20. november 2003 - 16:24 Der er 9 kommentarer og
1 løsning

Få egen ip-adresse

Jeg har brug for en lille stump C-kode, som returnerer min egen IP-adresse, gerne i "human readable format".

Jeg har kigget på sockets i Windows SDK, men har ikke kunnet finde et godt eksempel.

mvh&tak
Avatar billede jpk Nybegynder
20. november 2003 - 16:29 #1
Avatar billede soreno Praktikant
20. november 2003 - 16:39 #2
Eller hvis du også skal bruge mere info:

#include <windows.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <time.h>

char * trim(char *text)
{
    int length = strlen(text)-1;
    int pos = length;
   
    while(text[length]==0x20 || text[length]==0x0a || text[length]==0x0d)
    {
        length--;
    }

    text[length+1] = 0x00;
    return text;
}

int main(int argc, char *argv)
{
    IP_ADAPTER_INFO AdapterInfo[16];
    DWORD dwBufLen = sizeof(AdapterInfo);
    DWORD dwStatus = GetAdaptersInfo(AdapterInfo, &dwBufLen);
    IP_ADAPTER_INFO *pAdapterInfo = AdapterInfo;

    FIXED_INFO AdapterFixedInfo[16];
    DWORD dwLen = sizeof(AdapterFixedInfo);
    GetNetworkParams(AdapterFixedInfo, &dwLen);
    FIXED_INFO *pAdapterFixedInfo = AdapterFixedInfo;
    IP_ADDR_STRING *dnsList;
 
    do
    {
        printf("<adapter>\n");
        printf("\t<name>%s</name>\n", trim(pAdapterInfo->Description));
        printf("\t<ip>%s</ip>\n", pAdapterInfo->IpAddressList.IpAddress.String);

        BYTE mac[8];
        for(int i=0;i<8;i++)
        {
            mac[i] = pAdapterInfo->Address[i];
        }
        char macaddr[32] = "";
        sprintf(macaddr, "%02x-%02x-%02x-%02x-%02x-%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);

        printf("\t<mac>%s</mac>\n", macaddr);
        printf("\t<subnet>%s</subnet>\n", pAdapterInfo->IpAddressList.IpMask.String);
        printf("\t<dhcp_lease_obtained>%s</dhcp_lease_obtained>\n", trim(ctime(&pAdapterInfo->LeaseObtained)));
        printf("\t<dhcp_lease_expires>%s</dhcp_lease_expires>\n", trim(ctime(&pAdapterInfo->LeaseExpires)));
        printf("</adapter>\n");

        pAdapterInfo = pAdapterInfo->Next;
    }
    while(pAdapterInfo);
   
    return 0;
}

Output hos mig:
<adapter>
        <name>D-Link DFE-538TX 10/100 Adapter</name>
        <ip>212.10.184.xxx</ip>
        <mac>00-50-ba-4a-cb-12</mac>
        <subnet>255.255.240.0</subnet>
        <dhcp_lease_obtained>Thu Nov 20 16:28:19 2003</dhcp_lease_obtained>
        <dhcp_lease_expires>Thu Nov 20 16:58:19 2003</dhcp_lease_expires>
</adapter>
Avatar billede benjax Nybegynder
20. november 2003 - 16:44 #3
Tak soreno, det andet link var til C++ kode, og det kunne jeg ikke lige få til at spille når jeg omskrev til C. Prøver at kigge på dit kodeeksempel.
Avatar billede soreno Praktikant
20. november 2003 - 16:55 #4
Indholdet af linket omskrevet til at være c kompatibel:

#include <winsock.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    char buffer[80];
    WSADATA wsaData;
    struct hostent* phe;
    struct in_addr addr;
    int i;
   
    if(!WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
    {
        if(gethostname(buffer, sizeof(buffer)) != SOCKET_ERROR)
        {
            phe = gethostbyname(buffer);
            if(phe != 0)
            {
                for(i=0;phe->h_addr_list[i] != 0; i++)
                {
                    memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr));
                    printf("Address[%i] = %s\n", i, inet_ntoa(addr));
                }               
            }
            else
            {
                printf("*fail* phe is 0\n");
            }
        }
        else
        {
            printf("*fail* gethostname\n");
        }
       
        WSACleanup();
    }
    else
    {
        printf("*fail* WSAStartup\n");
    }

    return 0;
}
Avatar billede soreno Praktikant
20. november 2003 - 17:01 #5
Og mit som er konverteret til at være c kompatibel:

#include <windows.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <time.h>

char * trim(char *text)
{
    int length = strlen(text)-1;
    int pos = length;
   
    while(text[length]==0x20 || text[length]==0x0a || text[length]==0x0d)
    {
        length--;
    }

    text[length+1] = 0x00;
    return text;
}

int main(int argc, char *argv)
{
    IP_ADAPTER_INFO AdapterInfo[16];
    DWORD dwBufLen = sizeof(AdapterInfo);
    DWORD dwStatus = GetAdaptersInfo(AdapterInfo, &dwBufLen);
    IP_ADAPTER_INFO *pAdapterInfo = AdapterInfo;
    FIXED_INFO AdapterFixedInfo[16];
    DWORD dwLen = sizeof(AdapterFixedInfo);
    GetNetworkParams(AdapterFixedInfo, &dwLen);
    FIXED_INFO *pAdapterFixedInfo = AdapterFixedInfo;
    IP_ADDR_STRING *dnsList;
    BYTE mac[8];
    char macaddr[32] = "";
    int i;
   
    do
    {
        printf("<adapter>\n");
        printf("\t<name>%s</name>\n", trim(pAdapterInfo->Description));
        printf("\t<ip>%s</ip>\n", pAdapterInfo->IpAddressList.IpAddress.String);
       
        for(i=0;i<8;i++)
        {
            mac[i] = pAdapterInfo->Address[i];
        }
        sprintf(macaddr, "%02x-%02x-%02x-%02x-%02x-%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);

        printf("\t<mac>%s</mac>\n", macaddr);
        printf("\t<subnet>%s</subnet>\n", pAdapterInfo->IpAddressList.IpMask.String);
        printf("\t<dhcp_lease_obtained>%s</dhcp_lease_obtained>\n", trim(ctime(&pAdapterInfo->LeaseObtained)));
        printf("\t<dhcp_lease_expires>%s</dhcp_lease_expires>\n", trim(ctime(&pAdapterInfo->LeaseExpires)));
        printf("</adapter>\n");

        pAdapterInfo = pAdapterInfo->Next;
    }
    while(pAdapterInfo);
   
    return 0;
}
Avatar billede benjax Nybegynder
21. november 2003 - 09:43 #6
Soreno, tak for dine gode eksempler.

Min compiler (Borland C/C++ 5.02) brokker sig desværre over iphlpapi.h, som den ikke kan finde. Jeg fandt den så under Dev-Cpp\include og satte den til at includere dette directory, men når jeg herefter prøver at oversætte, får jeg "Unresolved external" for GetAdaptersInfo() og GetNetworkParams().
Avatar billede benjax Nybegynder
21. november 2003 - 10:04 #7
Jeg kan i øvrigt heller ikke oversætte det med bloodshed dev-cpp.
Avatar billede benjax Nybegynder
21. november 2003 - 13:14 #8
Okay, nu har jeg fået flikket noget sammen med basis i eksempel 1, der virker.
Soreno, smid et svar for points - tak. :o)
Avatar billede soreno Praktikant
21. november 2003 - 16:26 #9
Ok.

Med Dev-cpp (mingw compileren) kan du opdatere win32API'et her:
http://prdownloads.sf.net/mingw/w32api-2.4.tar.gz?download

Så virker det.

Du skal bare tilføje:
-liphlpapi

somewhere i project settings.
Avatar billede benjax Nybegynder
25. november 2003 - 10:27 #10
Fint nok Soreno, det prøver jeg.
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis