Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Как узнать свой локальный ip через Си [закрыт]

#c #сеть #ip


        
             
                
                    
                        
                            Закрыт. Данный вопрос необходимо конкретизировать. Ответы
на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он был сосредоточен только на одной проблеме, отредактировав его.
                        
                        Закрыт 10 месяцев назад.
                                                                                
           
                
        
Как через си можно узнать свой локальный ip 
    


Ответы

Ответ 1



#include //printf #include //memset #include //errno #include //socket #include //sockaddr_in #include //getsockname #include //close int main ( int argc , char *argv[] ) { const char* google_dns_server = "8.8.8.8"; int dns_port = 53; struct sockaddr_in serv; int sock = socket ( AF_INET, SOCK_DGRAM, 0); //Socket could not be created if(sock < 0) { perror("Socket error"); } memset( &serv, 0, sizeof(serv) ); serv.sin_family = AF_INET; serv.sin_addr.s_addr = inet_addr( google_dns_server ); serv.sin_port = htons( dns_port ); int err = connect( sock , (const struct sockaddr*) &serv , sizeof(serv) ); struct sockaddr_in name; socklen_t namelen = sizeof(name); err = getsockname(sock, (struct sockaddr*) &name, &namelen); char buffer[100]; const char* p = inet_ntop(AF_INET, &name.sin_addr, buffer, 100); if(p != NULL) { printf("Local ip is : %s \n" , buffer); } else { //Some error printf ("Error number : %d . Error message : %s \n" , errno , strerror(errno)); } close(sock); return 0; } Возвращает ( Local ip is : 192.168.0.11 ) (мой локальный адрес)

Ответ 2



Под Windows - примерно так, компилил VC++. #define _WINSOCK_DEPRECATED_NO_WARNINGS #include #include #include #pragma comment(lib,"ws2_32.lib") int main(int argc, const char * argv[]) { WSADATA wsaData; if (!WSAStartup(WINSOCK_VERSION, &wsaData)) { char chInfo[64]; if (!gethostname(chInfo, sizeof(chInfo))) { struct hostent *sh; sh=gethostbyname((char*)&chInfo); if (sh!=NULL) { int nAdapter = 0; while (sh->h_addr_list[nAdapter]) { struct sockaddr_in adr; memcpy(&adr.sin_addr, sh->h_addr_list[nAdapter], sh->h_length); printf("%s\n", inet_ntoa(adr.sin_addr)); nAdapter++; } } } } WSACleanup(); } Под *nix'ы - я с ними не очень, смотрите, какие вызовы сокетов там... Честно показало все адаптеры - и реальный, и Oracle VM, и даже тот, который через VPN подключен... :)

Комментариев нет:

Отправить комментарий