名字与地址转换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命令可以查看那当前运行的服务及其状态

[[email protected] 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) 正在运行...

时间: 2024-10-29 19:07:43

名字与地址转换getservbyname 与 getservbyport函数的相关文章

sockets: DNS库函数的名字与地址转换

########################################################### DNS库函数的名字与地址转换 ###################################################### 通常给出的是数值地址(也就是IP地址),不方便记忆: 域名系统(DNS):用于在主机名字和IP地址之间的映射. /etc/resolv.conf包含本地名字服务器主机的IP地址. 获取名字和地址信息的方法: 1.使用DNS 2.静态主机文件

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

一. 域名系统(DNS) 1. 简介 DNS主要用于主机名和IP地址之间的映射. 主机名可以是简单的名字ljm,也可以是全限定域名ljm.localdomainbaidu.com等. 2.资源记录 DNS中的条目称为资源记录(RR).我们感兴趣的RR类型只有几个: A             A记录把一个主机名映射为一个32位的IPv4地址. AAAA    4A记录把一个主机名映射为一个128位的IPv6地址. 例如: ljm               IN      A    127.0.

UNP第11章——名字与地址转换

1.域名系统 程序中只使用主机名和服务名的好处是,如果IP或端口变化,只需要改变映射关系,不需要重新编译程序. 1.1 资源记录 DNS的条目为资源记录,有用的项如下: A IPv4地址 AAAA IPv6地址 CNAME 规范名字 如: ftp.unpbook.com 的 CNAME 为 linux.unpbook.com www.unpbook.com 的 CNAME 为 linux.unpbook.com 1.2 解析器和名字服务器 程序通过调用解析器库函数,调用DNS服务.常用的函数为

UNIX网络编程卷一:第十一章 名字与地址转换

名字和数值地址间的转换函数(IPV4): gethostbyname gethostbyaddr 服务名字和端口号之间转换: getservbyname getservbyport 协议无关函数: getaddrinfo  : 主机名字和IP之间的转换 getnameinfo : 服务名字和端口号 实践代码:https://github.com/huntinux/unpvol1/tree/master/11chp

第十一章 名字和地址转换

struct hostent { char *h_name;        官方主机名 char **h_aliases;    别名字符串的指针数组 int h_addrtype;        IP地址类型 int h_length;            IP地址长度 char **h_addr_list;    IP地址字符串的指针数组 }; 有一个hostent.c的例子,然后我想写一个gethostbyaddr的例子,但是遇到了问题, 描述一下: #include <stdio.h>

apue和unp的学习之旅11——名字与数值地址转换

//-------------------------------------1.为什么使用名字好----------------------------------------- 我们应该使用名字而不是数值来标识主机(例如数值206.6.226.33),服务器(例如端口13代表标准的daytime服务器),然而出于以下几个理由,我们应该使用名字而不是数值: 1).名字好记住 2).数值地址可以变动而名字保持不变 3).随着往IPv6上转移,数值地址变得相当长,手工键入地址很容易出错. //--

1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

 1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接.socket本身有"插座"的意思,因此用来描述网络连 接的一对一关系. TCP/IP协议最早在BSD UNIX上实现,

【UNIX网络编程(一)】套接字地址结构、网络字节序和地址转换函数

引言:套接字地址结构在网络编程的每个实现中都要用到,因此掌握套接字地址结构是以后编写网络程序的前提,地址结构可以在两个方向上传递:从进程到内核和从内核到进程.地址转换函数在地址的文本表达和他们存放在套接字地址结构中的二进制值之间进行转换. 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数.不同协议都有自己的套接字地址结构.通用的套接字地址结构是sockaddr.IPv4套接字地址结构是定义在头文件<netinet/in.h>中的sockaddr_in,其POSIX定义如下: stru

(四十七)socket编程——socket引入、网络字节序、IP地址转换函数、sockaddr数据结构介绍

一.什么是socket socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接.socket本身有"插座"的意思,因此用来描述网络连接的一对一关系. TCP/IP协议最早在BSD UNIX上实现,为TCP/