码迷,mamicode.com
首页 > 其他好文 > 详细

名字与地址转换getservbyname 与 getservbyport函数

时间:2015-10-05 19:31:14      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:

名字与地址转换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) 正在运行...

名字与地址转换getservbyname 与 getservbyport函数

标签:

原文地址:http://www.cnblogs.com/rexienk/p/4856079.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!