`
unsoundboy
  • 浏览: 60858 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Linux网络编程--3. 服务器和客户机的信息函数

阅读更多
Linux网络编程--3. 服务器和客户机的信息函数
http://linuxc.51.net 作者:hoyt (2001-05-08 11:20:14)
这一章我们来学习转换和网络方面的信息函数. 

3.1 字节转换函数 
在网络上面有着许多类型的机器,这些机器在表示数据的字节顺序是不同的, 比如i386芯片是低字节在内存地址的低端,高字节在高端,而alpha芯片却相反. 为了统一起来,在Linux下面,有专门的字节转换函数. 

unsigned long  int htonl(unsigned long  int hostlong)
unsigned short int htons(unisgned short int hostshort)
unsigned long  int ntohl(unsigned long  int netlong)
unsigned short int ntohs(unsigned short int netshort)

在这四个转换函数中,h 代表host, n 代表 network.s 代表short l 代表long 第一个函数的意义是将本机器上的long数据转化为网络上的long. 其他几个函数的意义也差不多. 

3.2 IP和域名的转换 
在网络上标志一台机器可以用IP或者是用域名.那么我们怎么去进行转换呢? 

 struct hostent *gethostbyname(const char *hostname)
 struct hostent *gethostbyaddr(const char *addr,int len,int type)
 在中有struct hostent的定义
 struct hostent{
        char *h_name;           /* 主机的正式名称  */
        char *h_aliases;        /* 主机的别名 */
        int   h_addrtype;       /* 主机的地址类型  AF_INET*/
        int   h_length;         /* 主机的地址长度  对于IP4 是4字节32位*/
        char **h_addr_list;     /* 主机的IP地址列表 */
        }
  #define h_addr h_addr_list[0]  /* 主机的第一个IP地址*/

gethostbyname可以将机器名(如 linux.yessun.com)转换为一个结构指针.在这个结构里面储存了域名的信息 
gethostbyaddr可以将一个32位的IP地址(C0A80001)转换为结构指针. 

这两个函数失败时返回NULL 且设置h_errno错误变量,调用h_strerror()可以得到详细的出错信息 


3.3 字符串的IP和32位的IP转换. 
在网络上面我们用的IP都是数字加点(192.168.0.1)构成的, 而在struct in_addr结构中用的是32位的IP, 我们上面那个32位IP(C0A80001)是的192.168.0.1 为了转换我们可以使用下面两个函数 

int inet_aton(const char *cp,struct in_addr *inp)
char *inet_ntoa(struct in_addr in)

函数里面 a 代表 ascii n 代表network.第一个函数表示将a.b.c.d的IP转换为32位的IP,存储在 inp指针里面.第二个是将32位IP转换为a.b.c.d的格式. 


3.4 服务信息函数 
在网络程序里面我们有时候需要知道端口.IP和服务信息.这个时候我们可以使用以下几个函数 

 int getsockname(int sockfd,struct sockaddr *localaddr,int *addrlen)
 int getpeername(int sockfd,struct sockaddr *peeraddr, int *addrlen)
 struct servent *getservbyname(const char *servname,const char *protoname)
 struct servent *getservbyport(int port,const char *protoname)
 struct servent
        {
                char *s_name;          /* 正式服务名 */
                char **s_aliases;      /* 别名列表 */  
                int s_port;            /* 端口号 */
                char *s_proto;         /* 使用的协议 */ 
        }

一般我们很少用这几个函数.对应客户端,当我们要得到连接的端口号时在connect调用成功后使用可得到 系统分配的端口号.对于服务端,我们用INADDR_ANY填充后,为了得到连接的IP我们可以在accept调用成功后 使用而得到IP地址. 

在网络上有许多的默认端口和服务,比如端口21对ftp80对应WWW.为了得到指定的端口号的服务 我们可以调用第四个函数,相反为了得到端口号可以调用第三个函数. 


3.5 一个例子 

#include 
#include 
#include 
#include 
#include 

int main(int argc ,char **argv)
{
        struct sockaddr_in addr;
        struct hostent *host;
        char **alias;
        
        if(argc<2)
        {
         fprintf(stderr,"Usage:%s hostname|ip..\n\a",argv[0]);
         exit(1);
        }
        
        argv++;
        for(;*argv!=NULL;argv++)
        {
                /* 这里我们假设是IP*/   
                if(inet_aton(*argv,&addr.sin_addr)!=0)
                {
                   host=gethostbyaddr((char   *)&addr.sin_addr,4,AF_INET); 
                   printf("Address information of Ip %s\n",*argv); 
                } 
                else 
                {
                      /* 失败,难道是域名?*/
                      host=gethostbyname(*argv); printf("Address information
                      of host %s\n",*argv); 
                }
                if(host==NULL)
                {
                        /* 都不是 ,算了不找了*/
                        fprintf(stderr,"No address information of %s\n",*argv);
                        continue;
                }
                printf("Official host name %s\n",host->h_name);
                printf("Name aliases:");
                for(alias=host->h_aliases;*alias!=NULL;alias++)
                 printf("%s ,",*alias);
                printf("\nIp address:");
                for(alias=host->h_addr_list;*alias!=NULL;alias++)
                  printf("%s ,",inet_ntoa(*(struct in_addr *)(*alias)));
        }
}

在这个例子里面,为了判断用户输入的是IP还是域名我们调用了两个函数,第一次我们假设输入的是IP所以调用inet_aton, 失败的时候,再调用gethostbyname而得到信息. 
分享到:
评论

相关推荐

    Linux网络编程.pdf

    第4章 TCP客户机-服务器程序示例 第5章 UDP套接字 第6章 进程和信号 第7章 高级套接字函数 第8章 套接字选项 第9章 进程间通信 第10章 带外数据 第11章 原始套接字 第12章 输入/输出模型 第13章 服务器模型

    Linux网络编程电子书.rar

    第一章 linux网络编程概述 第二章 tcp/ip 第三章 套接字函数 第四章 tcp客户机服务器程序实例 第五章 udp套接字 第六章 进程和信号 第七章高级套接字函数 第八章 套接字选项 第九章 进程间的通信 第十章 带外数据 第...

    linux网络编程学习笔记

    命令 netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的 选项 我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可以使用帮 助手册获得详细的情况. telnet telnet是一...

    Linux高性能服务器编程

    4.6 HTTP通信 4.6.1 HTTP请求 4.6.2 HTTP应答 4.7 实例总结 第二篇 深入解析高性能服务器编程第5章 Linux网络编程基础API 5.1 socket地址API 5.1.1 主机字节序和网络字节序 5.1.2 通用socket地址 5.1.3 ...

    网络编程实用教程(第三版).zip

    2.1.3 套接字编程接口在Windows和Linux操作系统中得到继承和发展 25 2.1.4 套接字编程接口的两种实现方式 25 2.1.5 套接字通信与UNIX操作系统的输入/输出的关系 26 2.2 套接字编程的基本概念 27 2.2.1 什么...

    网络socket编程指南

    网络socket编程指南 -------------------------------------------------------------------------------- 介绍  Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的...

    嵌入式Linux入门笔记(十年程序员精品推荐、让你看得懂的笔记、结合开发板例程精心讲解)

    第一阶段在PC机上学习熟悉Linux. 一.Red Hat Linux 9下的常用操作… ………………… 二.Minicom的使用….… 三.NFS的使用… … 四.应用程序编程实验…… 五.模块编程实验…… 六.简单的字符设备驱动实验…… 第二...

    RED HAT LINUX 6大全

    第四部分为Linux编程;第五部分为附录。本书内容翔实、涉及领域广泛,并且提供了详细的例子和大量的参考资料(包括书籍、电子文档和Internet站点),是一本学习、使用和管理Linux不可多得的好书。 目 录 译者序 前言...

    Linux-socket编程指南

    3) 网络理论 4) 结构体 5) 本机转换 6) IP 地址和如何处理它们 7) socket()函数 8) bind()函数 9) connect()函数 10) listen()函数 11) accept()函数 12) send()和recv()函数 13) sendto()和recvfrom()...

    Linux程序设计 第4版.haozip01

    15.2.10 主机字节序和网络字节序 525 15.3 网络信息 527 15.3.1 因特网守护进程(xinetd/inetd) 531 15.3.2 套接字选项 533 15.4 多客户 534 15.4.1 select系统调用 537 15.4.2 多客户 540 15.5 数据报 543 ...

    Linux程序设计 第4版.haozip02

    15.2.10 主机字节序和网络字节序 525 15.3 网络信息 527 15.3.1 因特网守护进程(xinetd/inetd) 531 15.3.2 套接字选项 533 15.4 多客户 534 15.4.1 select系统调用 537 15.4.2 多客户 540 15.5 数据报 543 ...

    C语言SOCKEt编程指南.rar

    3) 网络理论 4) 结构体 5) 本机转换 6) IP 地址和如何处理它们 7) socket()函数 8) bind()函数 9) connect()函数 10) listen()函数 11) accept()函数 12) send()和recv()函数 13) sendto()和...

    UNIX环境高级编程

    15.5 客户机-服务器连接函数 371 15.5.1 SVR4 372 15.5.2 4.3+BSD 375 15.6 open服务器第2版 378 15.7 小结 385 习题 385 第16章 数据库函数库 386 16.1 引言 386 16.2 历史 386 16.3 函数库 386 16.4 实现概述 388 ...

    中文第一版-UNIX环境高级编程

    15.5 客户机-服务器连接函数 371 15.5.1 SVR4 372 15.5.2 4.3+BSD 375 15.6 open服务器第2版 378 15.7 小结 385 习题 385 第16章 数据库函数库 386 16.1 引言 386 16.2 历史 386 16.3 函数库 386 16.4 实现概述 388 ...

    基于java的局域网聊天系统-毕业设计.doc

    编程语言:java 硬件平台 CPU:Pentium4以上 内存:128M以上 软件平台 操作系统:windows系列,mac系列,linux等 开发工具: Eclipse,JDK6 描述: (1)实现群聊和私聊; (2)实现文件的发送与接收; (3)实现截图功能...

    UNIX环境高级编程第二版

    15.5 客户机-服务器连接函数 371 15.5.1 SVR4 372 15.5.2 4.3+BSD 375 15.6 open服务器第2版 378 15.7 小结 385 习题 385 第16章 数据库函数库 386 16.1 引言 386 16.2 历史 386 16.3 函数库 386 16.4 实现概述 388 ...

    LINUX网站建设技术指南

    5.1.3 设置NFS客户机 5.1.4 NFS的工作原理 5.1.5 NFS守护程序的启动过程 5.1.6 各服务进程的作用 5.2 建立PPP连接和配置PPP服务器 5.2.1 有关PPP的基础知识 5.2.2 使用PPP拨号上网 5.2.3 配置PPP服务器 5.3 配置DNS...

    UNIX环境高级编程 不扣分哦

    15.5 客户机-服务器连接函数 371 15.5.1 SVR4 372 15.5.2 4.3+BSD 375 15.6 open服务器第2版 378 15.7 小结 385 习题 385 第16章 数据库函数库 386 16.1 引言 386 16.2 历史 386 16.3 函数库 386 16.4 实现概述 388 ...

Global site tag (gtag.js) - Google Analytics