hostname和ip相互转换(GTK+界面)

运行效果:

代码:

/* GTK+ application: hostname and ip interconversion */
#include <gtk/gtk.h>
#include <assert.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

#define MAX_HOSTNAME_LEN 128
#define MAX_IP_LEN 128
struct HostnameIPEntryPack
{
	GtkWidget *mHostname;
	GtkWidget *mIP;
};

/**
 * func: hostname_to_ip
 * @return : 0 indicating success; -1 indicating failure;
 * @hostname: hostname of the target host, must not be NULL
 * @ip: parameter used to return an ip
 *
 **/
int hostname_to_ip(const char *hostname, char *ip)
{
	assert(hostname != NULL);
	assert(ip != NULL);

	struct addrinfo hints;
	struct addrinfo *result, *rp;
	int ret;

	/* obtaining ip address matching hostname */
	memset(&hints, 0, sizeof(struct addrinfo));
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_flags = AI_CANONNAME;
	hints.ai_protocol = 0;	/* any protocol */

	ret = getaddrinfo(hostname, NULL, &hints, &result);
	if (ret != 0)
	{
		return -1;
	}

	for (rp = result; rp != NULL; rp = rp->ai_next)
	{
		ret = getnameinfo(rp->ai_addr, rp->ai_addrlen, ip, MAX_IP_LEN, NULL, 0, NI_NUMERICHOST);
		if (ret != 0)
		{
			continue;
		}
		else
		{
			break;	/* get an ip, we break out, return immediately */
		}
	}
	freeaddrinfo(result);
	if (rp == NULL)
		return -1;
	else
		return 0;
}

/**
 * func: ip_to_hostname
 *
 **/
int ip_to_hostname(const char *ip, char *hostname)
{
	assert(hostname != NULL);
	assert(ip != NULL);

	struct addrinfo hints;
	struct addrinfo *result, *rp;
	int ret;

	/* obtaining ip address matching hostname */
	memset(&hints, 0, sizeof(struct addrinfo));
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_flags = AI_CANONNAME | AI_NUMERICHOST;
	hints.ai_protocol = 0;	/* any protocol */

	ret = getaddrinfo(ip, NULL, &hints, &result);
	if (ret != 0)
	{
		return -1;
	}

	for (rp = result; rp != NULL; rp = rp->ai_next)
	{
		ret = getnameinfo(rp->ai_addr, rp->ai_addrlen, hostname, MAX_HOSTNAME_LEN, NULL, 0, NI_NAMEREQD);
		if (ret != 0)
		{
			continue;
		}
		else
		{
			break;	/* get an ip, we break out, return immediately */
		}
	}
	freeaddrinfo(result);
	if (rp == NULL)
		return -1;
	else
		return 0;
}

void closeApp(GtkWidget *window, gpointer data)
{
	gtk_main_quit();
}

void button_host_to_ip_clicked(GtkWidget *button, gpointer data)
{
	GtkWidget *hostnameEntry = ((struct HostnameIPEntryPack *)data)->mHostname;
	GtkWidget *IPEntry = ((struct HostnameIPEntryPack *)data)->mIP;
	const char *hostname = gtk_entry_get_text(GTK_ENTRY(hostnameEntry));
	char ip[MAX_IP_LEN] = {0};
	int ret = hostname_to_ip(hostname, ip);
	if (ret == 0)
	{
		gtk_entry_set_text(GTK_ENTRY(IPEntry), ip);
	}
	else
	{
		gtk_entry_set_text(GTK_ENTRY(IPEntry), "Not Found");
	}
}

void button_ip_to_host_clicked(GtkWidget *button, gpointer data)
{
	GtkWidget *hostnameEntry = ((struct HostnameIPEntryPack *)data)->mHostname;
	GtkWidget *IPEntry = ((struct HostnameIPEntryPack *)data)->mIP;
	const char *ip = gtk_entry_get_text(GTK_ENTRY(IPEntry));
	char hostname[MAX_HOSTNAME_LEN] = {0};
	int ret = ip_to_hostname(ip, hostname);
	if (ret == 0)
	{
		gtk_entry_set_text(GTK_ENTRY(hostnameEntry), hostname);
	}
	else
	{
		gtk_entry_set_text(GTK_ENTRY(hostnameEntry), "Not Found");
	}
}

int main(int argc, char *argv[])
{
	GtkWidget *window;
	GtkWidget *hostname_label, *ip_label;
	GtkWidget *hostname_entry, *ip_entry;
	GtkWidget *hostname_to_ip_button, *ip_to_hostname_button;
	GtkWidget *hbox1, *hbox2, *hbox3;
	GtkWidget *vbox;
	struct HostnameIPEntryPack pack;

	gtk_init(&argc, &argv);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window), "IP<->Hostname");
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
	gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);

	g_signal_connect(GTK_OBJECT(window), "destroy", 
			 GTK_SIGNAL_FUNC(closeApp), NULL);

	hostname_label = gtk_label_new("Hostname:");
	ip_label = gtk_label_new("IP:");

	hostname_entry = gtk_entry_new();
	ip_entry = gtk_entry_new();
	pack.mHostname = hostname_entry;
	pack.mIP = ip_entry;

	hostname_to_ip_button = gtk_button_new_with_label("Hostname -> IP");
	ip_to_hostname_button = gtk_button_new_with_label("IP -> Hostname");

	g_signal_connect(GTK_OBJECT(hostname_to_ip_button), "clicked",
			 GTK_SIGNAL_FUNC(button_host_to_ip_clicked), &pack);
	g_signal_connect(GTK_OBJECT(ip_to_hostname_button), "clicked",
			 GTK_SIGNAL_FUNC(button_ip_to_host_clicked), &pack);

	hbox1 = gtk_hbox_new(TRUE, 5);
	hbox2 = gtk_hbox_new(TRUE, 5);
	hbox3 = gtk_hbox_new(TRUE, 5);
	vbox = gtk_vbox_new(TRUE, 10);

	gtk_box_pack_start(GTK_BOX(hbox1), hostname_label, TRUE, FALSE, 5);
	gtk_box_pack_start(GTK_BOX(hbox1), hostname_entry, TRUE, FALSE, 5);

	gtk_box_pack_start(GTK_BOX(hbox2), ip_label, TRUE, FALSE, 5);
	gtk_box_pack_start(GTK_BOX(hbox2), ip_entry, TRUE, FALSE, 5);

	gtk_box_pack_start(GTK_BOX(hbox3), hostname_to_ip_button, TRUE, FALSE, 5);
	gtk_box_pack_start(GTK_BOX(hbox3), ip_to_hostname_button, TRUE, FALSE, 5);

	gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 5);
	gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 5);
	gtk_box_pack_start(GTK_BOX(vbox), hbox3, FALSE, FALSE, 5);

	gtk_container_add(GTK_CONTAINER(window), vbox);

	gtk_widget_show_all(window);
	gtk_main();

	return 0;
}

hostip: hostip.c
	gcc hostip.c -o hostip `pkg-config --cflags --libs gtk+-2.0`

 

 

 

转载于:https://my.oschina.net/u/158589/blog/63214

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值