函數原型
#include <unistd.h>
int gethostname(char *hostname, size_t size);
參數說明
hostname:輸出緩衝區指針,用於存儲主機名字串 (以 \0 結尾)。
size:緩衝區大小 (位元組)。若主機名過長會被截斷 (不保證以 \0 結尾,建議分配足夠大,如 256 字節)。
返回值
0:成功。
-1:失敗,設置 errno (如 ENAMETOOLONG 緩衝區太小)。
使用場景
- 獲取本機主機名用於日誌、標識、集群選舉。
- 配合
gethostbyname() (或現代 getaddrinfo()) 解析本機 IP 地址。
代碼示例
#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
#include <arpa/inet.h>
int main()
{
char hostname[256];
if (gethostname(hostname, sizeof(hostname)) == 0)
{
printf("主機名: %s\n", hostname);
// 進一步解析 IP
struct hostent *he = gethostbyname(hostname);
if (he)
{
struct in_addr **addr_list = (struct in_addr **)he->h_addr_list;
for (int i = 0; addr_list[i] != NULL; i++)
{
printf("IP %d: %s\n", i, inet_ntoa(*addr_list[i]));
}
}
}
else
{
perror("gethostname");
}
return 0;
}
注意
gethostbyname 為過時 API,非線程安全,新代碼請用 getaddrinfo。
- 主機名通常為短名 (不含域名),FQDN 需 DNS 查詢或
getaddrinfo 配合 AI_CANONNAME。