名字与地址转换getservbyname 与 getservbyport函数
名字与地址转换getservbyname 与 getservbyport函数
服务也通常靠名字来标志,getservbyname函数用于根据给定名字查找相应服务。
#include
struct servent *getservbyname( const char *servname, const char *protoname );
成功:返回servent类型非空指针;
失败:空指针;
本函数返回非空指针
struct servent
{
char *s_name; // 服务的正是名字
char **s_aliases; // 别名列表
int s_port; // 服务端口号
char *s_proto; // 使用的协议
};
服务名参数servname必须指定。如果同时指定了协议(即protoname参数为非空指针),那么指定的服务必须有匹配的协议。有些因特网服务既用于TCP也用于UDP提供(如DNS)。如果protoname没有指定而servname指定服务支持多个协议,那么返回那个端口号取决于实现。一般来说,支持多个协议的服务旺旺使用相同的TCP端口号和UDP端口号。
servent结构中关心的主要是端口号。
注意:该端口号是以网络字节的顺序返回的,因此把它存放到套接口地质结构时绝对不能调用htons。
函数getservbyport用于根据给定端口号和可选协议查找相应的服务。
#include
struct servent *getservbyport( int port, const char *protoname );
成功:返回servent类型非空指针;
失败:空指针;
注意: port的值必须为网络字节序,如:
ptr = getservbyport( htons(53), "udp"); // DNS using UDP
示例代码:
int main(int argc, char** argv)
{
int sockFd,n;
char recvLine[MAXLINE + 1], addrStr[128],str[INET_ADDRSTRLEN];;
char **charpptr;
struct sockaddr_in servAddr;
struct in_addr **pptr;
struct in_addr *inetAddrP[2];
struct in_addr inetAddr;
struct hostent *hptr;
struct servent *sptr;
if(argc != 3)
{
ReportError("Usage : GetService ");
exit(1);
}
if((hptr = gethostbyname(argv[1])) == NULL)
{
if(inet_aton(argv[1], &inetAddr) == 0)
{
ReportError("hostName error for %s : %s",argv[1],hstrerror(h_errno));
exit(1);
}
else
{
inetAddrP[0] = &inetAddr;
inetAddrP[1] = NULL;
pptr = inetAddrP;
}
}
else //先打印host信息
{
printf("Official hostname : %s\n",hptr->h_name);
for(charpptr=hptr->h_aliases; *charpptr!=NULL; ++charpptr)
printf("\tAlias : %s\n",*charpptr);
switch(hptr->h_addrtype)
{
case AF_INET:
for(charpptr = hptr->h_addr_list; *charpptr!=NULL; ++charpptr)
printf("\tAddress : %s\n",
inet_ntop(hptr->h_addrtype, *charpptr, str, sizeof(str)));
break;
}
pptr = (struct in_addr**)hptr->h_addr_list;
}
if( (sptr = getservbyname(argv[2], "tcp")) == NULL)
{
ReportError("getservbyname error for %s",argv[2]);
exit(1);
}
printf("Official service name : %s\n",sptr->s_name);//打印service信息
for(charpptr=sptr->s_aliases; *charpptr!=NULL; ++charpptr)
printf("\tAlias : %s\n",*charpptr);
printf("\tPort number : %d\n",sptr->s_port);
printf("\tprotocol : %s\n",sptr->s_proto);
for(; *pptr != NULL; ++pptr)
{
if((sockFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
ReportError("socket error");
exit(1);
}
bzero(&servAddr, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_port = sptr->s_port;//根据获取的服务信息设置端口号
memcpy(&servAddr.sin_addr, *pptr, sizeof(struct in_addr));//根据hostname信息设置IP
inet_ntop(AF_INET, (struct sockaddr*)&servAddr, addrStr,sizeof(servAddr));
printf("trying %s : %d\n", addrStr, servAddr.sin_port);
if(connect(sockFd, (struct sockaddr*)&servAddr, sizeof(servAddr)) == 0) //连接成功
break;
ReportError("connect error");
close(sockFd);
}
if(*pptr == NULL)
{
ReportError("unable to connet");
exit(1);
}
while( (n=read(sockFd, recvLine, MAXLINE)) > 0)
{
recvLine[n] = 0;
fputs(recvLine, stdout);
}
return 0;
}
连接被拒绝,不知道什么原因,难道是相应的服务没开启?
用service --status-all命令可以查看那当前运行的服务及其状态
[root@localhost bin]# service --status-all
abrtd (pid 1979) 正在运行...
abrt-dump-oops (pid 1987) 正在运行...
acpid (pid 1801) 正在运行...
atd (pid 2006) 正在运行...
auditd (pid 1679) 正在运行...
avahi-daemon (pid 1775) 正在运行...
用法:/etc/init.d/bluetooth {start|stop}
Stopped
cgred 已停
cpuspeed 已停
crond (pid 1995) 正在运行...
dnsmasq 已停
用法:/etc/init.d/firstboot {start|stop}
hald (pid 1810) 正在运行...
httpd 已停
表格:filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all ::/0 ::/0 state RELATED,ESTABLISHED
2 ACCEPT icmpv6 ::/0 ::/0
3 ACCEPT all ::/0 ::/0
4 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:22
5 REJECT all ::/0 ::/0 reject-with icmp6-adm-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all ::/0 ::/0 reject-with icmp6-adm-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
表格:filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
irqbalance 已停
Kdump is not operational
mdmonitor (pid 1733) 正在运行...
messagebus (pid 1752) 正在运行...
模块 netconsole 未被加载
配置设备:
lo eth0
当前的活跃设备:
lo eth0
NetworkManager (pid 1763) 正在运行...
ntpd 已停
master (pid 1955) 正在运行...
进程记帐被禁用。
quota_nld 已停
rdisc 已停
restorecond (pid 2781) 正在运行...
rngd 已停
rsyslogd (pid 1695) 正在运行...
sandbox is stopped
saslauthd 已停
smartd 已停
openssh-daemon (pid 1879) 正在运行...
wpa_supplicant (pid 1812) 正在运行...
转载于:https://www.cnblogs.com/rexienk/p/4856079.html
名字与地址转换getservbyname 与 getservbyport函数相关推荐
- UNP总结 Chapter 11 名字与地址转换
本章讲述在名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IP地址间进行转换,getservbyname和getservbyport在服务器名字和端口 ...
- UNP Chapter 9 - 基本名字与地址转换
9.1. 概述 本章讲述在名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IP地址间进行转换,getservbyname和getservbyport在 ...
- Unix网络编程学习笔记之第11章 名字与地址转换
一. 域名系统(DNS) 1. 简介 DNS主要用于主机名和IP地址之间的映射. 主机名可以是简单的名字ljm,也可以是全限定域名ljm.localdomainbaidu.com等. 2.资源记录 D ...
- 网络编程学习——名字与地址转换(一)
2019独角兽企业重金招聘Python工程师标准>>> 1 域名系统 域名系统(Domain Name System,DNS)主要用于主机名字与IP地址之间的映射.主机名既可以是一个 ...
- UNP Chapter 11 - 高级名字与地址转换
11.1. 概述 函数gethostbyname和gethostbyaddr是依赖于协议的,使用前一个函数时,我们必须知道放置结果的套接口地址结构的成员是哪一种(举例来说,IPv4使用sin_addr ...
- 网络编程学习笔记(getservbyname和getservbyport函数)
通过服务器的名字而不是服务器端口号来认知它,而且如果从主机到端口号的映射包含在一个文件中(一般是/etc/services),则如果端口号改变,我们所需做的所有改动就是改动文件/etc/service ...
- (域名、主机名、服务名、端口号)名字与地址的转换 (gethostbyname、getservbyname、getaddrinfo、getnameinfo等)
转载地址 本章讲述在名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IP地址间进行转换,getservbyname和getservbyport在服务器 ...
- 《UNIX网络编程:套接字联网API》啃书笔记(第8UDP套接字编程、11章地址转换)
基本UDP套接字编程 下图为UDP客户/服务器程序的函数调用: 注意客户不与服务器建立连接,而是只管使用sendto函数给服务器发送数据报,其中必须指定目的地的地址作为参数.类似的,服务器不接受来自客 ...
- UNP编程:29---名字与地址转换之(域名系统)
一.域名系统的概念 域名系统(Domain Name System,DNS)主要用于主机名字与IP地址之间的映射. 主机名既可以是一个简单名字(simple name),例如solaris或bsdi, ...
最新文章
- 你写的ML代码占多少内存?这件事很重要,但很多人还不懂
- linux iptables扩展,脚本防火墙
- oracle命令格式,OraCmD(Oracle命令行工具) V3.1 官方版
- WebDAV方式访问Exchange 2003收件箱程序
- mysql field flags_PHPmysql_field_flags()实例教程_PHP教程
- O-矩阵相乘-Warshall算法详解
- CentOS下安装两个或多个Tomcat7
- 教新手小白如何通过五分钟学会用Python爬取女神照片!
- qq视频转码失败怎么办_迅捷视频转换器转换失败的解决方法
- 什么是局域计算机网络,什么是局域网_局域网概述
- 图像算法(一):最近邻插值,双线性插值,三次插值
- 安防流媒体无插件直播管理设计
- TPCC-Mysql 测试
- Prometheus原理详解
- 用python来控制wifi连接
- origin修复中_win10系统中Origin Access出错如何修复
- 【我的OpenGL学习进阶之旅】解决着色器语法错误:The shader uses varying u_Color, but previous shader does not write to it
- 如何设置 HomePod?HomePod设置教程分享
- 一年外包工作经验深圳辞职后工资水平能达到多少?
- 软件架构入门及分类——云架构
热门文章
- Web后端语言模拟http请求 带用户名和密码 实例代码大全
- 自建数据集系列:实例分割mask->语义分割mask->扩增mask
- java毕业设计SEOUL设计师品牌代购商城Mybatis+系统+数据库+调试部署
- 2018 dota2 战队十杀分析
- 用软件可编程FPGA加速网络边缘的移动应用总结
- Node.js知识点整理之----Buffer类
- Python 不用selenium 带你高效爬取京东商品评论
- 如何选择低价高防服务器?
- 人生苦短,必须性感!
- [学习记录]realsence d455 +vins-fusion+px4+ego_planner下无人机的悬停与控制