<Winsock网络编程经络>读书笔记_1


基本数据结构

    通用socket地址结构
          struct sockaddr
           {
                 u_short sa_family;           //协议地址簇
                 char sa_data[14];             //通用地址
           }

    ipv4专用地址结构
          struct sockaddr_in
           {
               short   sin_family;                // 协议地址簇
               u_short sin_port;                 // 端口号,网络字节序
               struct  in_addr sin_addr;       // ip地址,网络字节序
               char    sin_zero[8];                // 这8个字节纯粹是为了跟通用地址结构体对齐用的,没有实际用处
           };

          struct in_addr
           {
               union
               {
                   struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
                   struct { u_short s_w1,s_w2; } S_un_w;
                   u_long S_addr;
               } S_un;

          #define s_addr   S_un.S_addr                  //can be used for most tcp &amp; ip code
          #define s_imp     S_un.S_un_w.s_w2        // imp
          #define s_net      S_un.S_un_b.s_b1        // network

          #define s_host    S_un.S_un_b.s_b2       // host on imp
          #define s_lh        S_un.S_un_b.s_b3         // logical host
          #define s_impno S_un.S_un_b.s_b4     //  imp

十一章转换函数

          unsign long WSAAPI inet_addr(const char FAR * cp);
       描述:
            将一个点分十进制表示的ipv4地址转换为一个32位的二进制描述的网络字节序地址
      参数:
            cp有四种形式,a.b.c.d, a.b.c, a.b a
       返回值
             成功返回一个32位二进制描述的网络字节序地址;

             如果传入字符串不是合法的地址,函数失败返回INADDR_NONE。(注意:INADDR_NONE = 0xffffffff,如果字符串为广播地址“255.255.255.255”,函数返回值也是 0xffffffff,与出错时的返回值相同)

           char FAR *WSAAPI inet_ntoa(struct in_addr in);
       描述:
             将一个ipv4结构体地址转换为点分十进制地址字符串
       参数:
              struct in_addr 结构体对象
       返回值:
              成功返回一个指向静态(static)缓冲区的指针,是可现实的ascII字符串,包含点分十进制描述的网络地址;

              失败返回NULL。(注意:函数返回的字符串所用的内存是winsock分配,so要使用这个字符串需要调用者保存此字符串的副本)

 第十二章函数_同步名字解析

                hostent结构体

                   struct  hostent

                   {

                         char    FAR * h_name;           /* official name of host */

                         char    FAR * FAR * h_aliases;  /* alias list */

                         short   h_addrtype;             /* host address type */

扫描二维码关注公众号,回复: 373592 查看本文章

                         short   h_length;               /* length of address */

                         char    FAR * FAR * h_addr_list; /* list of addresses */ 网络字节序地址

                         #define h_addr  h_addr_list[0]          /* address, for backward compat */

                   };



 

 

      struct hostent FAR * WSAAPI gethostbyname(  const char FAR * name  );

      struct hostent FAR * WSAAPI gethostbyaddr(const char FAR * addr, int len, int type );

      描述:

              根据应用程序传入的主机名(或者ip地址)得到与主机有关的信息,

       要使用返回的信息,需要调用者复制一份该结构体

      参数:

             name:要解析的主机名字,注意不能解析ip地址。当为空字符串,或者NULL时,得到的本机的信息

             addr:指向struct in_addr结构体的指针。

             len: 地址的长度,对于ipv4长度就是4

             type: 地址类型,如ipv4为AF_INET

      返回值:

             成功返回一个指向hostent结构体的指针;

             失败返回NULL,应用程序可以通过WSAGetLastError()得到具体的错误代码。

 

       servent结构体

            struct  servent

            {

                     char    FAR * s_name;           /* official service name */

                     char    FAR * FAR * s_aliases;  /* alias list */

                     short   s_port;                 // port  网络字节序

                     char    FAR * s_proto;          /* protocol to use */

            };

       struct servent FAR * WSAAPI getservbyname(  char FAR * name, const char FAR * proto );

       struct servent FAR * WSAAPI getservbyport( int port,  const char FAR * proto );

       描述:

              根据名字或者端口号查看服务信息(ftp,telnet,http等),

       从本地系统的配置文件Windows\System32\drivers\etc\services查询

       (PS: 这个服务在网络协议里面就是应用层协议)

 

       参数:

              name:服务的名字

              port:   服务的端口

              proto: 传输层协议,比如“tcp”

        返回值:

              成功返回指向servent结构体的指针;

              失败返回NULL,可以调用WSAGetLastError()得到具体的错误码

 

        protoent结构体

               struct  protoent

                {

                    char    FAR * p_name;           /* official protocol name */

                    char    FAR * FAR * p_aliases;  /* alias list */

                    short   p_proto;                /* protocol 主机字节序

                };

       struct protoent FAR * WSAAPI getprotobynumber(int number);

       struct protoent FAR * WSAAPI getprotobyname( const char FAR * name );

       描述:

               根据协议名字或者协议编号(在tcp/ip协议簇里面的报文头里面的号码),查询协议相关信息。

        从本地系统的配置文件Windows\System32\drivers\etc\protocol文件中查询

        (PS: 这个协议在网络协议里面就是传输层跟网络层的协议)

       参数:

               number:协议的编号

               name:协议的名字

       返回值:

              成功返回指向protoent结构体的指针;

              失败返回NULL,调用者可以调用WSAGetLastError()得到具体的错误信息

十三章 异步名字解析

            HANDLE WSAAPI WSAAsyncGetHostByName(

                       HWND hWnd,

                       u_int wMsg,

                       const char FAR * name,

                       char FAR * buf,

                       int buflen);

             HANDLE WSAAPI WSAAsyncGetHostByAddr(

                       HWND hWnd, 

                       u_int wMsg,

                       const char FAR * addr, 

                       int len,int type,

                       char FAR * buf,

                       int buflen);

             描述:

                     通过名字或地址进行主机名的异步查询

             参数:

                    hWnd:应用程序窗口句柄,异步操作完成时,该句柄指向的窗口会收到wMsg消息

                    wMsg:请求完成时收到的消息编号,由应用程序自己定义

                    name:主机名字,以'\0'结束

                    addr:  主机地址,按网络字节序保存

                    len:     addr的长度

                    buf:    包含查询结果的数据缓冲区,返回的数据其实是hostent结构体,建议大小是

                         AXGETHOSTSTRUCT

             返回值:

                    成功返回异步操作的句柄;

                    失败返回0,调用WSAGetLastError()可以得到具体的错误码。

猜你喜欢

转载自talenth.iteye.com/blog/2184356
今日推荐