名字与地址转换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函数相关推荐

  1. UNP总结 Chapter 11 名字与地址转换

    本章讲述在名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IP地址间进行转换,getservbyname和getservbyport在服务器名字和端口 ...

  2. UNP Chapter 9 - 基本名字与地址转换

    9.1. 概述 本章讲述在名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IP地址间进行转换,getservbyname和getservbyport在 ...

  3. Unix网络编程学习笔记之第11章 名字与地址转换

    一. 域名系统(DNS) 1. 简介 DNS主要用于主机名和IP地址之间的映射. 主机名可以是简单的名字ljm,也可以是全限定域名ljm.localdomainbaidu.com等. 2.资源记录 D ...

  4. 网络编程学习——名字与地址转换(一)

    2019独角兽企业重金招聘Python工程师标准>>> 1 域名系统 域名系统(Domain Name System,DNS)主要用于主机名字与IP地址之间的映射.主机名既可以是一个 ...

  5. UNP Chapter 11 - 高级名字与地址转换

    11.1. 概述 函数gethostbyname和gethostbyaddr是依赖于协议的,使用前一个函数时,我们必须知道放置结果的套接口地址结构的成员是哪一种(举例来说,IPv4使用sin_addr ...

  6. 网络编程学习笔记(getservbyname和getservbyport函数)

    通过服务器的名字而不是服务器端口号来认知它,而且如果从主机到端口号的映射包含在一个文件中(一般是/etc/services),则如果端口号改变,我们所需做的所有改动就是改动文件/etc/service ...

  7. (域名、主机名、服务名、端口号)名字与地址的转换 (gethostbyname、getservbyname、getaddrinfo、getnameinfo等)

    转载地址 本章讲述在名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IP地址间进行转换,getservbyname和getservbyport在服务器 ...

  8. 《UNIX网络编程:套接字联网API》啃书笔记(第8UDP套接字编程、11章地址转换)

    基本UDP套接字编程 下图为UDP客户/服务器程序的函数调用: 注意客户不与服务器建立连接,而是只管使用sendto函数给服务器发送数据报,其中必须指定目的地的地址作为参数.类似的,服务器不接受来自客 ...

  9. UNP编程:29---名字与地址转换之(域名系统)

    一.域名系统的概念 域名系统(Domain Name System,DNS)主要用于主机名字与IP地址之间的映射. 主机名既可以是一个简单名字(simple name),例如solaris或bsdi, ...

最新文章

  1. 你写的ML代码占多少内存?这件事很重要,但很多人还不懂
  2. linux iptables扩展,脚本防火墙
  3. oracle命令格式,OraCmD(Oracle命令行工具) V3.1 官方版
  4. WebDAV方式访问Exchange 2003收件箱程序
  5. mysql field flags_PHPmysql_field_flags()实例教程_PHP教程
  6. O-矩阵相乘-Warshall算法详解
  7. CentOS下安装两个或多个Tomcat7
  8. 教新手小白如何通过五分钟学会用Python爬取女神照片!
  9. qq视频转码失败怎么办_迅捷视频转换器转换失败的解决方法
  10. 什么是局域计算机网络,什么是局域网_局域网概述
  11. 图像算法(一):最近邻插值,双线性插值,三次插值
  12. 安防流媒体无插件直播管理设计
  13. TPCC-Mysql 测试
  14. Prometheus原理详解
  15. 用python来控制wifi连接
  16. origin修复中_win10系统中Origin Access出错如何修复
  17. 【我的OpenGL学习进阶之旅】解决着色器语法错误:The shader uses varying u_Color, but previous shader does not write to it
  18. 如何设置 HomePod?HomePod设置教程分享
  19. 一年外包工作经验深圳辞职后工资水平能达到多少?
  20. 软件架构入门及分类——云架构

热门文章

  1. Web后端语言模拟http请求 带用户名和密码 实例代码大全
  2. 自建数据集系列:实例分割mask->语义分割mask->扩增mask
  3. java毕业设计SEOUL设计师品牌代购商城Mybatis+系统+数据库+调试部署
  4. 2018 dota2 战队十杀分析
  5. 用软件可编程FPGA加速网络边缘的移动应用总结
  6. Node.js知识点整理之----Buffer类
  7. Python 不用selenium 带你高效爬取京东商品评论
  8. 如何选择低价高防服务器?
  9. 人生苦短,必须性感!
  10. [学习记录]realsence d455 +vins-fusion+px4+ego_planner下无人机的悬停与控制