现在的位置: 首页 > 综合 > 正文

Winsock的几个有用的Api函数

2017年12月01日 ⁄ 综合 ⁄ 共 3379字 ⁄ 字号 评论关闭

 

一, GetHostByName

 struct hostent *gethostbyname(const char *name);
    这个函数的传入值是域名或者主机名,例如"www.google.com","wpc"等等。
    传出值,是一个hostent的结构(如下)。如果函数调用失败,将返回NULL。

    struct hostent {
      char  *h_name;
      char  **h_aliases;
      int   h_addrtype;
      int   h_length;
      char  **h_addr_list;
      }
      {
    解释一下这个结构:
    其中,
      char *h_name 表示的是主机的规范名。例如www.google.com的规范名其实是www.l.google.com
      char   **h_aliases 表示的是主机的别名。www.google.com就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。
      int   h_addrtype 表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是ipv6(AF_INET6)
      int   h_length 表示的是主机ip地址的长度
      int   **h_addr_lisst 表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。所以到真正需要打印出这个IP的话,需要调用inet_ntop()。

    二,Inet_nTop

const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) :
    这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中。
    这个函数,其实就是返回指向dst的一个指针。如果函数调用错误,返回值是NULL。

三,Inet_nToa

  将网络地址转换成“.”点隔的字符串格式。

  char FAR* PASCAL FAR inet_ntoa( struct in_addr in);

  in:一个表示Internet主机地址的结构。

注释:
  本函数将一个用in参数所表示的Internet地址结构转换成以“.” 间隔的诸如“a.b.c.d”的字符串形式。请注意inet_ntoa()返回的字符串存放在WINDOWS套接口实现所分配的内存中。应用程序不应假设该内存是如何分配的。在同一个线程的下一个WINDOWS套接口调用前,数据将保证是有效。

返回值:
  若无错误发生,inet_ntoa()返回一个字符指针。否则的话,返回NVLL。其中的数据应在下一个WINDOWS套接口调用前复制出来。

四,ntohl

简述:
     将一个无符号长整形数从网络字节顺序转换为主机字节顺序。
     #include <winsock.h>
     u_long PASCAL FAR ntohl( u_long netlong);
     netlong:一个以网络字节顺序表达的32位数。
注释:
     本函数将一个32位数由网络字节顺序转换为主机字节顺序。
返回值
     ntohl()返回一个以主机字节顺序表达的数。
五, inet_addr()
 
简述:
    将一个点间隔地址转换成一个in_addr
    #include <winsock.h>
    unsigned long PASCAL FAR inet_addr( const struct FAR* cp);
    cp:一个以Internet标准“.”间隔的字符串。
注释:
    本函数解释cp参数中的字符串,这个字符串用Internet的“.”间隔格式表示一个数字的Internet地址。返回值可用作Internet地址。所有Internet地址以网络字节顺序返回(字节从左到右排列)。
    Internet地址用“.”间隔的地址可有下列几种表达方式:
    a.b.c.d,a.b.c,a.b,a
    当四个部分都有定值时,每个都解释成一个字节数据,从左到右组成Internet四字节地址。请注意,当一个Internet地址在Intel机器上表示成一个32位整型数时,则上述的字节为“d.c.b.a”。这是因为Intel处理器的字节是从右向左排列的。
    请注意:只有Berkeley支持下述表达法,Internet其余各处均不支持。考虑到与软件的兼容性,应按规定进行使用。
    对一个三部分地址,最后一部分解释成16位数据并作为网络地址的最右两个字节。这样,三部分地址便很容易表示B组网络地址,如“128.net.host”.
    对一个两部分地址,最后一部分解释成24位数据并作为网络地址的最右三个字节,这样,两部分地址便很容易表示C组网络地址,如“net.host”。
    对仅有一个部分的地址,则将它的值直接存入网络地址不作任何字节的重组。
返回值:
    若无错误发生,inet_addr()返回一个无符号长整型数,其中以适当字节顺序存放Internet地址。如果传入的字符串不是一个合法的Internet地址,如“a.b.c.d”地址中任一项超过255,那么inet_addr()返回INADDR_NONE。
六,

一、WSAStartup函数
                int WSAStartup
                       (
                          WORD wVersionRequested,
                          LPWSADATA lpWSAData
                         );
使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0。
例:假如一个程序要使用2.1版本的Socket,那么程序代码如下
wVersionRequested = MAKEWORD( 2, 1 );
err = WSAStartup( wVersionRequested, &wsaData );

二、WSACleanup函数
int WSACleanup (void);
应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。
三 Socket接口的检索有关域名、通信服务和协议等Internet信息的数据库函数,如

gethostbyaddr、gethostbyname、gethostname、getprotolbyname

getprotolbynumber、getserverbyname、getservbyport。
 1.gethostname()

  【函数原型】

int PASCAL FAR gethostname (char FAR * name, int namelen);

  【使用说明】

  该函数可以获取本地主机的主机名,其中:

  name:<输出>用于指向所获取的主机名的缓冲区的指针。

  Namelen:<输入>缓冲区的大小,以字节为单位。

  返回值:若无错误,返回0;否则,返回错误代吗。
2.gethostbyname()

  【函数原型】

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

  【使用说明】

  该函数可以从主机名数据库中得到对应的“主机”。

  该函数唯一的参数name就是前面调用函数gethostname()得到的主机名。若无错误,刚返回一个指向hostent结构的批针,它可以标识一个“主机”列表。

抱歉!评论已关闭.