Linux 网络编程: gethostbyname( ), getservbyname( )
前言
最近在学习网络编程,用到几个应该比较常用的网络编程函数,所以写篇博客来记录一下,毕竟学得快忘得也快。国庆节在宿舍写着博客看着各个景点人山人海倒也快哉~
gethostbyname( )
这个函数可以返回给定域名的域名信息。
参数:域名
返回值:
- 一个 hostent 结构体的地址(也就是一个指向 hostent 结构体的指针)
- 0(如果域名不能解析成 IP 地址)
从netdb.h头文件我们可以找到 hostent 结构体的说明:
struct hostent {
char *h_name; /*official host name */
char **h_aliases; /*other aliases */
int h_addrtype; /*address type */
int h_length; /* address length */
char **h_addr_list; /* list of addresses */
};
#define h_addr h_addr_list[0]
上面结构体中的 **h_addr_list 是一个二进制整数的链表,输出的时候要用 inet_ntop( ) 函数转换成点分十进制。
inet_ntop( )
inet_ntop( ) 和 inet_ntop( ) 都是IP地址转换函数,可以在将IP地址在“二进制整数”和“点分十进制”之间转换。而且,这2个函数能够处理 ipv4 和 ipv6 。
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
这个函数转换网络二进制结构到ASCII类型的地址,参数的作用和inet_pton相同,只是多了一个参数 socklen_t cnt ,他是所指向缓存区 dst 的大小,避免溢出,如果缓存区太小无法存储地址的值,则返回一个空指针,并将 errno 置为 ENOSPC 。
现在那就来实战一下吧:
#include <stdio.h>
#include <netdb.h>
#include <arpa/inet.h>
int main(int argc, char **argv)
{
struct hostent *hptr;
char *name, **pptr, str[32];
int count = 0;
if (argc < 2) {
printf("The arguments is not enough!");
return -1;
}
name = argv[1];
hptr = gethostbyname(name);
if (hptr) {
printf("the offical name is %s.\n", hptr->h_name);
for(pptr = hptr->h_aliases; *pptr != NULL; pptr++) {
printf("the alias name is %s\n", *pptr);
}
switch (hptr->h_addrtype) {
case AF_INET:
printf("the address type is AF_INET.\n");
break;
case AF_INET6:
printf("the address type is AF_INET6.\n");
break;
default:
break;
}
printf("the address length is %d Bytes.\n", hptr->h_length);
for (pptr = hptr->h_addr_list; *pptr != NULL; pptr++) { //**pptr后移四个字节,即地址后移四位
count ++;
printf("the %dth address is %s.\n", count, inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str))); //即将转换成的点分十进制存到字符串 str 中返回,溢出则返回空指针
}
} else {
printf("Error!\n");
}
return 0;
}
编译运行:

getservbyname
这个函数可以返回给定服务名和协议名的相关服务信息。
参数:服务名和协议名
返回值:
- 一个指向 servent 结构体的指针
- 空指针(发生错误)
从netdb.h头文件我们可以找到 hostent 结构体的说明:
struct servent {
char *s_name; /*official service name */
char **s_aliases; /*other aliases */
int s_port; /*port for this service */
char **s_proto; /* protocol to use */
};
返回的结构体中的端口号是按网络字节顺序保存的整数,输出的时候要用 ntohs() 函数转换按主机顺序保存的整数。
ntohs( )
网络字节顺序NBO(Network Byte Order):按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。
主机字节顺序(HBO,Host Byte Order):不同的机器HBO不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。
网络字节顺序与本地字节顺序之间的转换函数:
htonl()--"Host to Network Long"
ntohl()--"Network to Host Long"
htons()--"Host to Network Short"
ntohs()--"Network to Host Short"
现在就来实战一下吧:
#include <stdio.h>
#include <netdb.h>
int main (int argc, char* argv[])
{
struct servent *sptr;
char *service, *protocol;
if (argc < 3) {
printf("The arguments is not enough!\n");
return -1;
}
service = argv[1];
protocol = argv[2];
sptr = getservbyname(service, protocol);
if (sptr) {
printf("the port of service %s using %s protocol is %d.\n", sptr->s_name, protocol, ntohs(sptr->s_port)); //将网络字节顺序的端口值转换成主机顺序
} else {
printf("Error!\n");
}
return 0;
}
编译运行:

Linux 网络编程: gethostbyname( ), getservbyname( )的更多相关文章
- linux网络编程 gethostbyname()
gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针.结构的声明与gethostaddr()中一致. 返回对应于给定主机名的主机信息. #include ...
- Linux网络编程入门 (转载)
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- [转] - Linux网络编程 -- 网络知识介绍
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- 【转】Linux网络编程入门
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- 《转》Linux网络编程入门
原地址:http://www.cnblogs.com/duzouzhe/archive/2009/06/19/1506699.html (一)Linux网络编程--网络知识介绍 Linux网络编程-- ...
- Proxy源代码分析——谈谈如何学习Linux网络编程
Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到, Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该 ...
- 第5章 Linux网络编程基础
第5章 Linux网络编程基础 5.1 socket地址与API 一.理解字节序 主机字节序一般为小端字节序.网络字节序一般为大端字节序.当格式化的数据在两台使用了不同字节序的主机之间直接传递时,接收 ...
- Linux网络编程:一个简单的正向代理服务器的实现
Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到, Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该 ...
- Linux网络编程基础API
第5章 Linux网络编程基础API 探讨Linux网络编程基础API与内核中TCP/IP协议族之间的关系,并未后续章节提供编程基础.从3个方面讨论Linux网络API. socket地址API.so ...
随机推荐
- IBM HeapAnalyzer
https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/W3b463571efc8_4f02_99af_3cbc0 ...
- Intellij IDEA + Android SDK + Genymotion Emulator打造最佳Android开发
原文:Intellij IDEA + Android SDK + Genymotion Emulator打造最佳Android开发 Intellij IDEA + Android SDK + Geny ...
- Java中synchronized注意点
之前一直以为 synchronized 加在方法前面就只有一个线程能访问了,项目中碰到一个问题,一个类的不同对象,同时访问加了 synchronized的方法 同样是可以访问的,那是因为 synchr ...
- Gartner 认定 Microsoft 为具有远见卓识的云基础结构即服务提供商
四个月前, Windows Azure 基础结构服务结束了预览版阶段,正式发布了,它具有业内领先的 SLA.随后, 凭借愿景的完整性和执行力,Gartner 很快认可了 Microsoft 在市场中的 ...
- Codeforces Round#1
A. Theatre Square 题目大意:有一个长宽为m和n的广场,用边长为a的正方形去铺盖,问铺满最少需要多少正方形 题解:题目分解为用长度为a的线条分别去覆盖长度为m和n的线条,计算两者的乘积 ...
- How to get the xpath by clicking an html element
How to get the xpath by clicking an html element How to get the xpath by clicking an html element
- Sharpui企业版-简单介绍【01】 【QQ群:206378966】
1. 什么是Sharpui Sharpui是居于DUI思想的一套界面引擎,採用纯c++开发,实现完整的消息处理机制.渲染引擎分离以及灵活的控件扩展,是一款c++真正意义上的界面和业务逻 ...
- linux进程之fork 和 exec函数
---恢复内容开始--- fork函数 该函数是unix中派生新进程的唯一方法. #include <unistd.h> pid_t fork(void); 返回: (调用它一次, 它 ...
- PowerDesigner 基础使用
建表使用基础 1.打开软件,点击create model(如下图一)or 右上角 文件→建立新模型 or 快捷键 Ctrl+N(如下图二) 2.选择要生成脚本的数据库类型(见上图二) 3.建表(图三) ...
- 2014-07-23 利用ASP.NET自带控件实现单文件上传与下载
效果图 上传文件页面: 下载文件页面: 1.母版页site.Master <%@ Master Language="C#" AutoEventWireup="tr ...