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 fra Computerworld
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