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
Annonceindlæg tema
Cloud & AI
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
20. november 2003 - 16:29
#1
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>
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.
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; }
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; }
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().
21. november 2003 - 10:04
#7
Jeg kan i øvrigt heller ikke oversætte det med bloodshed dev-cpp.
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)
25. november 2003 - 10:27
#10
Fint nok Soreno, det prøver jeg.
Kurser inden for grundlæggende programmering