/* * Find local ip used as source ip in ip packets. * Use getsockname and a udp connection */ #include //printf #include //memset #include //errno #include //socket #include //sockaddr_in #include //getsockname #include //close #include "get_my_ip.h" int get_my_ip(char * remote_ip, char * my_ip ) { int dns_port = 53; struct sockaddr_in serv; int sock = socket ( AF_INET, SOCK_DGRAM, 0); //Socket could not be created if (sock < 0) { return 1; } memset( &serv, 0, sizeof(serv) ); serv.sin_family = AF_INET; serv.sin_addr.s_addr = inet_addr( remote_ip ); 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); strcpy(my_ip, buffer); close(sock); return 0; } else { //Some error printf ("Error number : %d . Error message : %s \n" , errno , strerror(errno)); close(sock); return 2; } }