সি প্রোগ্রামিং-এ সিস্টেমের হোস্টনেম এবং IP অ্যাড্রেস বের করতে নেটওয়ার্কিং হেডার ফাইলগুলো (<netdb.h>, <arpa/inet.h> ইত্যাদি) এবং সিস্টেম কল ব্যবহার করা হয়। এটি POSIX সিস্টেমে (লিনাক্স, macOS, Unix) কাজ করে।
ব্যবহৃত ফাংশনগুলো
| ফাংশন | কাজ |
gethostname() | লোকাল কম্পিউটারের স্ট্যান্ডার্ড হোস্টনেম বের করে |
gethostbyname() | হোস্টনেম থেকে হোস্ট ইনফো (IP ঠিকানা সহ) বের করে |
inet_ntoa() | IPv4 নেটওয়ার্ক অ্যাড্রেসকে ডটেড-ডেসিমাল স্ট্রিং-এ কনভার্ট করে |
পূর্ণ উদাহরণ (Linux/Unix)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void check_host_name(int hostname) {
if (hostname == -1) {
perror("gethostname");
exit(1);
}
}
void check_host_entry(struct hostent *hostentry) {
if (hostentry == NULL) {
perror("gethostbyname");
exit(1);
}
}
void check_IP_buffer(char *IPbuffer) {
if (IPbuffer == NULL) {
perror("inet_ntoa");
exit(1);
}
}
int main() {
char host[256];
char *IP;
struct hostent *host_entry;
int hostname;
hostname = gethostname(host, sizeof(host));
check_host_name(hostname);
host_entry = gethostbyname(host);
check_host_entry(host_entry);
// h_addr_list[0] হলো প্রথম IPv4 অ্যাড্রেস
IP = inet_ntoa(*((struct in_addr*) host_entry->h_addr_list[0]));
printf("Current Host Name: %s\n", host);
printf("Host IP: %s\n", IP);
return 0;
}
আউটপুট (নমুনা)
Current Host Name: soumyadeep-VirtualBox
Host IP: 127.0.1.1
গুরুত্বপূর্ণ নোট
gethostbyname() ডিপ্রিকেটেড (Deprecated) — আধুনিক কোডে getaddrinfo() ব্যবহার করুন (IPv6 সাপোর্ট, থ্রেড-সেফ)
inet_ntoa()ও ডিপ্রিকেটেড — inet_ntop() ব্যবহার করুন
- উইন্ডোজে
Winsock2.h লিংক করতে হয় (-lws2_32) এবং WSAStartup() কল করতে হয়
- মাল্টি-হোম্ড সিস্টেমে (একাধিক NIC/IP)
h_addr_list লুপ করে সব IP পাওয়া যায়
আধুনিক পদ্ধতি (getaddrinfo) — সংক্ষিপ্ত
struct addrinfo hints = {}, *res;
hints.ai_family = AF_INET; // IPv4
getaddrinfo(host, NULL, &hints, &res);
char ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &((struct sockaddr_in*)res->ai_addr)->sin_addr, ip, sizeof(ip));
freeaddrinfo(res);