第8章160winsock160api(编辑修改稿)内容摘要:
了。 在这种情况下 , lParam的低 16位提供所有信息所需的缓冲区大小。 如果应用程序认为获取的数据不够 , 它就可以在设置了足够容纳所需信息的缓冲区 (也就是大于 lParam低 16位提供的数值 )后 , 重新调用 WSAAsyncGetHostByName( )函数。 错 误 代 码 和 缓 冲 区 大 小 应 使 用WSAGETASYNCERROR 和 WSAGETASYNCBUFLEN宏从 lParam中取出。 这两个宏的定义如下: 第 8章 Winsock API define WSAGETASYNCERROR(lParam) HIWORD(lParam) define WSAGETASYNCBUFLEN(lParam) LOWORD(lParam) 使用这些宏可以最大限度地提高应用程序源代码的可移植性。 函数的返回值指出异步操作是否成功启动 , 注意它并不隐含操作本身的成功或失败 (后面要介绍的其他异步函数的返回值也与它类似 )。 第 8章 Winsock API 若操作成功启动 , 则 WSAAsyncGetHostByName( )返回一个 HANDLE类型的非 0值 , 它用来标识该异步请求任务的句柄。 通过该句柄使用 WSACancelAsyncRequest( )函数可取消该操作 , 也可通过检查 wParam消息参数 , 以匹配异步操作和完成消息。 如果异步操作不能启动 ,WSAAsyncGetHostByName( )返回一个 0值 , 并且可使用WSAGetLastError( )函数来获取如下的错误代码: ● WSANOTINITIALISED:在使用本 API前必须进行一次成功的 WSAStartup( )调用。 第 8章 Winsock API ● WSAENETDOWN: Windows Sockets实现已检测到网络子系统故障。 ● WSAEINPROGRESS : 一 个 阻 塞 的 Windows Sockets操作正在进行。 ● WSAEWOULDBLOCK:本异步操作此时由于Windows Sockets实现的资源或其他限制的制约而无法调度。 在应用程序的窗口收到消息时可能会设置下列错误代码 ,它们可以通过 WSAGETASYNCERROR宏从应答的消息lParam中取出: ● WSAENETDOWN: Windows Sockets实现已检测到网络子系统故障。 第 8章 Winsock API ● WSAENOBUFS:可用的缓冲区空间不足或没有。 ● WSAHOST_NOT_FOUND:未找到授权应答主机。 ● WSATRY_AGAIN:未找到非授权应答主机 ,或 SERVERFAIL。 ● WSANO_RECOVERY:不可恢复性错误。 ● WSANO_DATA:无请求类型的数据记录。 第 8章 Winsock API 根据主机地址取得主机信息 —— gethostbyaddr( )或WSAAsyncGetHostByAddr( ) 这两个函数可以根据主机的 IP地址取得主机名和主机地址等信息。 1. 函数格式 在 Winsock 1中提供的 gethostbyaddr( )函数的格式是: struct hostent FAR *gethostbyaddr( const char FAR* addr, int len, int type )。 第 8章 Winsock API 在 Winsock 1中提供的异步扩展WSAAsyncGetHostByAddr( )函数的格式是: HANDLE WSAAsyncGetHostByAddr( HWND hWnd, unsigned int wMsg, const char FAR* addr, int len, int type, char FAR* buf, int buflen )。 第 8章 Winsock API 2. 函数参数说明 gethostbyaddr( )函数的参数说明如下: ● addr:传入参数 , 指向网络字节顺序地址的指针。 ● len:传入参数 , 地址的长度 , 如果是 IPv4类型的地址 , 则该值为 4。 ● type:传入参数 , 地址类型 , 如为 AF_INET。 WSAAsyncGetHostByAddr( )函数是 gethostbyaddr( )函数的异步版本。 它的其他参数以及返回信息与WSAAsyncGetHostByName( )函数完全相同。 第 8章 Winsock API 3. 函数返回信息 这两个函数返回的信息与通过名称获取主机信息的 gethostbyname( )函数相同。 根据协议名取得主机协议信息 ——getprotobyname( )或 WSAAsyncGetProtoByName( ) 函数 getprotobyname()WSAAsyncGetProtoByName()可以根据协议名称返回对应的相关协议信息。 它们都要使用到一个与协议有关的结构,该结构的定义如下: 第 8章 Winsock API struct protoent{ char FAR* p_name。 char FAR* FAR * p_aliases。 short p_proto。 }。 该结构的成员有: ● p_name:正式的协议名。 ● p_aliases:它是二维字符指针 , 返回一个协议的所有别名。 ● p_proto:以主机字节顺序排列的协议号。 第 8章 Winsock API 1. 函数格式 在 Winsock 1中提供的 getprotobyname( )函数的格式是: struct protoent FAR *getprotobyname( const char FAR * name )。 在 Winsock 1中提供的异步扩展WSAAsyncGetProtoByName( )函数的格式是: HANDLE WSAAsyncGetProtoByName( HWND hWnd, unsigned int wMsg, const char FAR * name, char FAR * buf, int buflen )。 第 8章 Winsock API 2. 函数参数说明 getprotobyname( )函数中的参数 name为传入参数 , 指向协议名的指针。 异步扩展格式中的 buf是接收 protoent数据的缓冲区指针 ,buflen 为该缓冲区的大小。 其 他 参 数 与WSAAsyncGetHostByName( )函数中的参数相同 , 返回信息的含义也一样。 3. 函数返回信息 如果没有错误发生 , getprotobyname( )返回如上所述的一个指向 protoent结构的指针 , 如果调用失败 , 则返回一个空指针。 应用程序可以通过 WSAGetLastError( )来得到一个如下所示的特定错误代码: 第 8章 Winsock API ● WSANOTINTIALISED:在应用这个 API前 ,必须成功调用 WSAStartup( )。 ● WSAENETDOWN: Windows Sockets实现检测到了网络子系统的错误。 ● WSANO_RECOVERY:无法恢复的错误 , 如FORMERR、 REFUSED、 NOTIMP等。 ● WSANO_DATA:有效的名字 , 但没有关于请求类型的数据记录。 第 8章 Winsock API ● WSAEINPROGRESS:一个阻塞的 Windows Sockets操作正在进行。 ● WSAEINTR :阻塞调用被WSACancelBlockingCall( )取消了。 ● WSAHOST_NOT_FOUND:没有找到协议。 ● WSATRY_AGAIN:非正式的协议没有找到或服务器失败。 ● WSAEFAULT: name参数不在有效的用户地址空间。 第 8章 Winsock API 根据协议号取得主机协议信息 ——getprotobynumber( )或 WSAAsyncGetProtoByNumber( ) getprotobynumber( )和 WSAAsyncGetProtoByNumber返回对应于给定协议号的相关协议信息。 1. 函数格式 在 Winsock 1中提供的 getprotobynumber( )函数的格式是: struct protoent FAR *getprotobynumber( int number )。 第 8章 Winsock API 在 Winsock 1中提供的异步扩展WSAAsyncGetProtoByNumber( )函数的格式是: HANDLE WSAAsyncGetProtoByNumber( HWND hWnd, unsigned int wMsg, int number, char FAR * buf, int buflen )。 第 8章 Winsock API 2. 函数参数说明 参数 number表示传入参数 , 是一个以主机字节顺序排列的协议号。 异步扩展格式中的其他参数与WSAAsyncGetHostByName( )函数中的参数含义相同。 3. 函数返回信息 函数的返回信息与通过协议名获取主机协议信息时的情况相同。 第 8章 Winsock API 根据服务名取得相关服务信息 —— getservbyname( )或 WSAAsyncGetServByName( ) getservbyrvame( )和 WSAAsyncGetServByName( )函数用于返回对应于给定服务名和协议名的相关服务信息。 这两个函数都要用到一个如下所示的结构: struct servent{ char FAR* s_name。 char FAR* FAR* s_aliases。 short s_port。 char FAR * s_proto。 }。 第 8章 Winsock API 该结构中各成员的含义如下: ● s_name:正规的服务名。 ● s_aliases:所有其他的可选服务名。 ● s_port:连接该服务时需要用到的端口号 , 返回的端口号是以网络字节顺序排列的。 ● s_proto:连接该服务时用到的协议名。 第 8章 Winsock API 1. 函数格式 在 Winsock 1中提供的 getservbyname( )函数的格式是: struct servent FAR *getservbyname( const char FAR* name, const char FAR* proto )。 在 Winsock 1 中 提 供 的 异 步 扩 展WSAAsyncGetServByName( )函数的格式是: 第 8章 Winsock API HANDLE WSAAsyncGetServByName( HWND hWnd, unsigned int wMsg, const char FAR* name, const char FAR* proto, char FAR * buf, int buflen )。 第 8章 Winsock API 2. 函数参数说明 这两个函数中各参数的说明如下: ● name:传入参数 , 一个指向服务名的指针。 ● proto:传入参数 , 指向协议名的指针 (可选 )。 如果这个指针为空 , getservbyname( )返回第一个 name与 s_name或者某一个 s_aliases匹配的服务条目。 否则 ,getservbyname( )对 name和 proto都进行匹配。 其他参数与 WSAAsyncGetHostByName( )函数中的参数含义相同。 第 8章 Winsock API 根据端口号取。第8章160winsock160api(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。