• 名字与地址转换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 ",hptr->h_name);
            for(charpptr=hptr->h_aliases; *charpptr!=NULL; ++charpptr)
                printf(" Alias : %s ",*charpptr);
            switch(hptr->h_addrtype)
            {
                case AF_INET:
                    for(charpptr = hptr->h_addr_list; *charpptr!=NULL; ++charpptr)
                        printf(" Address : %s ",
                               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 ",sptr->s_name);//打印service信息
        for(charpptr=sptr->s_aliases; *charpptr!=NULL; ++charpptr)
            printf(" Alias : %s ",*charpptr);
        printf(" Port number : %d ",sptr->s_port);
        printf(" protocol : %s ",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 ", 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) 正在运行...

  • 相关阅读:
    websocket 心跳及重连
    Liunx下 tomcat自动重启脚本,亲测。
    Node.js 安装配置---菜鸟教程,贼好用
    Linux下安装Perl依赖
    Centos 8 虚拟机访问外网
    以后园子可能用的就比较少了qwq
    酒店之王
    git bash here创建项目时无法使用上下箭头
    Win10搭建IIS实现局域网访问网站
    js判断两个对象是否相同的三种方式
  • 原文地址:https://www.cnblogs.com/rexienk/p/4856079.html
Copyright © 2020-2023  润新知