`
unsoundboy
  • 浏览: 63487 次
  • 性别: 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而得到信息. 
分享到:
评论

相关推荐

    C语言SOCKET编程--超级完整.doc

    - Socket编程主要用于创建网络应用程序,如Web服务器、聊天应用等。 - 它提供了在不同主机之间发送数据的方法。 #### 二、平台与工具 - **平台**:本文档主要基于Linux平台进行讲解,同时也适用于HPUX等其他类...

    在Linux中实现客户机-服务器通信.rar_linux_linux 服务器_分布式_分布式计算_服务器客户机

    在IT领域,尤其是在系统编程和网络通信中,客户机-服务器模型是一种常见的架构模式,用于在多台计算机之间分配任务和资源。在这个场景下,"在Linux中实现客户机-服务器通信"是一个重要的实践课题,它涉及到Linux操作...

    Linux服务器客户机程序设计

    在计算机网络中,Linux服务器客户机程序设计是构建网络应用的核心技术之一。在这个主题下,我们主要关注如何在Linux环境中编写服务器和客户端程序,通过TCP/IP协议进行通信。以下是一些关键知识点的详细说明: 1. *...

    Linux网络编程.pdf

    该书内容分为基础部分和提高部分,基础部分涵盖了Linux网络编程的入门知识,包括Linux网络编程概述、TCP/IP协议、套接字基础函数、TCP客户机-服务器程序示例以及UDP套接字等内容。提高部分则进一步深入介绍Linux网络...

    Linux网络编程_张.pdf

    "04TCP客户机_服务器程序示例.pdf"和"07高级套接字函数.pdf"章节提供了具体的实例和高级功能,如连接重用、套接字选项的深入应用等,帮助读者更好地理解和实践网络编程。 "02TCP_IP协议.pdf"深入剖析了TCP/IP协议的...

    基于嵌入式Linux系统的网络编程技术.pdf

    本文详细介绍了基于嵌入式Linux系统的网络编程技术,涵盖了嵌入式Linux系统下的网络编程模型、Socket套接字的使用、客户机/服务器模式的实现等内容。 一、嵌入式Linux系统概述 嵌入式Linux系统具有稳定、高效、易...

    计算机网络课程设计—socket编程之服务器与客户机的时间比较

    本文将深入探讨“计算机网络课程设计—socket编程之服务器与客户机的时间比较”这一主题,重点关注如何利用socket接口实现一个TIME服务的TCP客户机和服务器,以及如何进行时间比较。 首先,我们需要理解TCP(传输...

    Linux网络编程电子书.rar

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

    unix下socket编程

    "Linux网络编程--3_服务器和客户机的信息函数"].htm"和"[Linux网络编程--3_服务器和客户机的信息函数].files"可能讲解了如何使用socket API中的`bind()`, `listen()`, `accept()`和`connect()`等函数来实现这一过程...

    Linux系统下的网络编程技术

    在深入探讨Linux系统下的网络编程技术之前,我们有必要先理解几个关键概念,这些概念构成了...通过理解和掌握Socket编程的关键函数和客户机/服务器模型,开发者可以在Linux平台上构建出稳定、可靠且高效的网络服务。

    Linux系统下的网络编程技术.pdf

    在Linux系统下进行网络编程,主要是利用Socket接口来实现客户端和服务器端的通信。Socket是网络编程中的核心组件,它提供了进程间通信的一种方式,特别适用于跨网络的通信。Linux操作系统因其开源、稳定和强大的网络...

    Linux网络编程(Socket技术)

    - **TCP/IP结构模型**:TCP/IP协议栈由应用层、传输层、网络层和网络接口层组成。 - **Internet协议(IP)**:IP协议定义了数据报文的格式以及如何在网络上路由这些数据报文。 - **传输控制协议(TCP)**:TCP提供了...

    Udp客户机和服务器编程

    本文将深入探讨UDP(用户数据报协议)客户机和服务器编程,旨在实现一个简单的通信系统,其中服务器从端口7000接收客户端发送的数据,并作出响应,而客户端则向服务器发送信息并接收反馈。该系统的设计与实现涉及多...

    proxy源代码分析

    该代码清晰地描述了客户机/服务器系统的概念,几乎包括了 Linux 网络编程的方方面面,非常适合 Linux 网络编程的初学者学习。 使用 Proxy 程序 ----------------- Proxy 程序的用法是:./Proxy &lt;proxy_port&gt; ...

    基于Linux网络聊天室的设计3.docx

    对于网络聊天室的设计,Linux提供了一个理想的平台,其丰富的开发工具和强大的网络编程支持使得构建网络聊天室成为可能。在Linux下,可以利用标准的C库和系统调用来实现网络通信,而Vi编辑器则提供了方便的代码编写...

    Linux编程:普通文件和目录编程、进程实验、命名管道实验、信号实验、域名解析实验、网络服务器和客户机

    为了进一步熟悉Linux编程,实验还涵盖了进程、命名管道、信号、域名解析以及网络服务器和客户机的编程。这些知识是构建复杂系统和网络应用程序的基础。 进程实验可能涉及创建子进程(`fork()`)、进程间通信(IPC,...

    client_service.rar_服务器客户机

    在这个"client_service.rar_服务器客户机"压缩包中,我们可能找到了一个实现Linux环境下的基本客户机-服务器功能的示例或工具。 客户机-服务器模型的核心思想是分工合作:服务器提供服务,而客户机请求并使用这些...

    linux网络编程一步一步学

    - **客户机/服务器模型**是最常见的网络编程模型之一,其中服务器端监听客户端的连接请求,并处理客户端发送的数据。 - **Socket**是实现网络编程的基础,它是一种在不同进程之间进行数据通信的方式。 #### 三、...

Global site tag (gtag.js) - Google Analytics