本文共 10629 字,大约阅读时间需要 35 分钟。
5.1.23 socket()
简述: 创建一个套接口。 #include <winsock.h> SOCKET PASCAL FAR socket( int af, int type, int protocol)<I>&#</I>59; af:一个地址描述。目前仅支持PF_INET格式,也就是说ARPA Internet地址格式。 type:新套接口的类型描述。 protocol:套接口所用的协议。如调用者不想指定,可用0。 注释: socket()函数用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源。如果协议protocol未指定(等于0),则使用缺省的连接方式。 对于使用一给定地址族的某一特定套接口,只支持一种协议。但地址族可设为AF_UNSPEC(未指定),这样的话协议参数就要指定了。协议号特定于进行通讯的“通讯域”。支持下述类型描述: 类型 解释 SOCK_STREAM 提供有序的、可靠的、双向的和基于连接的字节流,使用带外数据传送机制,为Internet地址族使用TCP。 SOCK_DGRAM 支持无连接的、不可靠的和使用固定大小(通常很小)缓冲区的数据报服务,为Internet地址族使用UDP。 SOCK_STREAM类型的套接口为全双向的字节流。对于流类套接口,在接收或发送数据前必需处于已连接状态。用connect()调用建立与另一套接 口的连接,连接成功后,即可用send()和recv()传送数据。当会话结束后,调用closesocket()。带外数据根据规定用send()和 recv()来接收。 实现SOCK_STREAM类型套接口的通讯协议保证数据不会丢失也不会重复。如果终端协议有缓冲区空间,且数据不能在一定时间成功发送,则认为连接中断,其后续的调用也将以WSAETIMEOUT错误返回。 SOCK_DGRAM类型套接口允许使用sendto()和recvfrom()从任意端口发送或接收数据报。如果这样一个套接口用connect()与一个指定端口连接,则可用send()和recv()与该端口进行数据报的发送与接收。 返回值: 若无错误发生,socket()返回引用新套接口的描述字。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。 错误代码: WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。 WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。 WSAEAFNOSUPPORT:不支持指定的地址族。 WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。 WSAEMFILE:无可用文件描述字。 WSAENOBUFS:无可用缓冲区,无法创建套接口。 WSAEPROTONOSUPPORT:不支持指定的协议。 WSAEPROTOTYPE:指定的协议不适用于本套接口。 WSAESOCKTNOSUPPORT:本地址族中不支持该类型套接口。 参见: accept(), bind(), connect(), getsockname(), getsockopt(), setsockopt(), listen(), recv(), recvfrom(), select(), send(), sendto(), shutdown(), ioctlsocket().4.2 数据库例程 5.2 数据库函数 5.2.1 gethostbyaddr() 简述: 返回对应于给定地址的主机信息。 #include <winsock.h> struct hostent FAR *PASCAL FAR gethostbyaddr(const char FAR * addr, int len, int type)<I>&#</I>59; addr:指向网络字节顺序地址的指针。 len: 地址的长度,在PF_INET类型地址中为4。 type:地址类型,应为PF_INET。 注释: gethostbyaddr()返回对应于给定地址的包含主机名字和地址信息的hostent结构指针。结构的声明如下: struct hostent { char FAR * h_name<I>&#</I>59; char FAR * FAR * h_aliases<I>&#</I>59; short h_addrtype<I>&#</I>59; short h_length<I>&#</I>59; char FAR * FAR * h_addr_list<I>&#</I>59; }<I>&#</I>59; 结构的成员有: 成员 用途 h_name 正规的主机名字(PC)。 h_aliases 一个以空指针结尾的可选主机名队列。 h_addrtype 返回地址的类型,对于Windows Sockets,这个域总是PF_INET。 h_legnth 每个地址的长度(字节数),对应于PF_INET这个域应该为4。 h_addr_list 应该以空指针结尾的主机地址的列表,返回的地址是以网络顺序排列的 为了保证其他旧的软件的兼容性,h_addr_list[0]被定义为宏h_addr。 返回的指针指向一个由Windows Sockets实现分配的结构。应用程序不应该试图修改这个结构或者释放它的任何部分。此外,每一线程仅有一份这个结构的拷贝,所以应用程序应该在发出其他Windows Scokets API调用前,把自己所需的信息拷贝下来。 返回值: 如果没有错误发生,gethostbyaddr()返回如上所述的一个指向hostent结构的指针,否则,返回一个空指针。应用程序可以通过WSAGetLastError()来得到一个特定的错误代码。 错误代码: WSANOTINTIALISED 在应用这个API前,必须成功地调用WSAStartup()。 WSAENTDOWN Windows Sockets实现检测到了网络子系统的错误。 WSAHOST_NOT_FOUND 没有找到授权应答主机。 WSATRY_AGAIN 没有找到非授权主机,或者SERVERFAIL。 WSANO_RECOVERY 无法恢复的错误,FORMERR,REFUSED,NOTIMP。 WSANO_DATA 有效的名字,但没有关于请求类型的数据记录。 WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行。 WSAEINTR 阻塞调用被WSACancelBlockingCall()取消了. 参见: WSAAsyncGetHostByAddr(), gethostbyname() 5.2.2 gethostbyname() 简述: 返回对应于给定主机名的主机信息。 #include <winsock.h> struct hostent FAR *PASCAL FAR gethostbyname(const char FAR * addr)<I>&#</I>59; name:指向主机名的指针。 注释: gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。结构的声明与gethostaddr()中一致。 返回的指针指向一个由Windows Sockets实现分配的结构。应用程序不应该试图修改这个结构或者释放它的任何部分。此外,每一线程仅有一份这个结构的拷贝,所以应用程序应该在发出其他Windows Scokets API调用前,把自己所需的信息拷贝下来。 gethostbyname() 实现没有必要识别传送给它的IP地址串。对于这样的请求,应该把IP地址串当作一个未知主机名同样处理。如果应用程序有IP地址串需要处理,它应该使用 inet_addr()函数把地址串转换为IP地址,然后调用gethostbyaddr()来得到hostent结构。 返回值: 如果没有错误发生,gethostbyname()返回如上所述的一个指向hostent结构的指针,否则,返回一个空指针。应用程序可以通过WSAGetLastError()来得到一个特定的错误代码。 错误代码: WSANOTINTIALISED 在应用这个API前,必须成功地调用WSAStartup()。 WSAENTDOWN Windows Sockets实现检测到了网络子系统的错误。 WSAHOST_NOT_FOUND 没有找到授权应答主机。 WSATRY_AGAIN 没有找到非授权主机,或者SERVERFAIL。 WSANO_RECOVERY 无法恢复的错误,FORMERR,REFUSED,NOTIMP。 WSANO_DATA 有效的名字,但没有关于请求类型的数据记录。 WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行。 WSAEINTR 阻塞调用被WSACancelBlockingCall()取消了. 参见: WSAAsyncGetHostByName(), gethostbyaddr() 5.2.3 gethostname() 简述: 返回本地主机的标准主机名。 #include <winsock.h> int PASCAL FAR gethostname(char FAR *name, int namelen)<I>&#</I>59; name: 一个指向将要存放主机名的缓冲区指针。 namelen:缓冲区的长度。 注释: 该函数把本地主机名存放入由name参数指定的缓冲区中。返回的主机名是一个以NULL结束的字符串。主机名的形式取决于Windows Sockets实现-它可能是一个简单的主机名,或者是一个域名。然而,返回的名字必定可以在gethostbyname()和 WSAAsyncGetHostByName()中使用。 返回值: 如果没有错误发生,gethostname()返回0。否则它返回SOCKET_ERROR。应用程序可以通过WSAGetLastError()来得到一个特定的错误代码。 错误代码: WSAEFAULT 名字长度参数太小。 WSANOTINTIALISED 在应用这个API前,必须成功地调用WSAStartup()。 WSAENTDOWN Windows Sockets实现检测到了网络子系统的错误。 WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行。 参见:gethostbyname(), WSAAsyncGetHostByName() 5.2.4 getprotobyname() 简述: 返回对应于给定协议名的相关协议信息。 #include <winsock.h> struct protoent FAR * PASCAL FAR getprotobyname(const char FAR * name)<I>&#</I>59; name:一个指向协议名的指针。 注释: getprotobyname()返回对应于给定协议名的包含名字和协议号的protoent结构指针。结构的声明如下: struct protoent { char FAR * p_name<I>&#</I>59; char Far * far * p_aliases<I>&#</I>59; short p_proto<I>&#</I>59; }<I>&#</I>59; 结构的成员有: 成员 用途 p_name 正规的协议名。 p_aliases 一个以空指针结尾的可选协议名队列。 p_proto 以主机字节顺序排列的协议号 返回的指针指向一个由Windows Sockets实现分配的结构。应用程序不应该试图修改这个结构或者释放它的任何部分。此外,每一线程仅有一份这个结构的拷贝,所以应用程序应该在发出其他Windows Scokets API调用前,把自己所需的信息拷贝下来。 返回值: 如果没有错误发生,getprotobyname()返回如上所述的一个指向protoent结构的指针,否则,返回一个空指针。应用程序可以通过WSAGetLastError()来得到一个特定的错误代码。 错误代码: WSANOTINTIALISED 在应用这个API前,必须成功地调用WSAStartup()。 WSAENTDOWN Windows Sockets实现检测到了网络子系统的错误。 WSANO_RECOVERY 无法恢复的错误,FORMERR,REFUSED,NOTIMP。 WSANO_DATA 有效的名字,但没有关于请求类型的数据记录。 WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行。 WSAEINTR 阻塞调用被WSACancelBlockingCall()取消了. 参见: WSAAsyncGetProtoByName(), getprotobynumber() 5.2.5 getprotobynumber() 简述: 返回对应于给定协议号的相关协议信息。 #include <winsock.h> struct protoent FAR * PASCAL FAR getprotobynumber(int number)<I>&#</I>59; number:一个以主机顺序排列的协议号。 注释: getprotobynumber()返回对应于给定协议名的包含名字和协议号的protoent结构指针。结构的声明与getprotobyname中的一致。 返回的指针指向一个由Windows Sockets实现分配的结构。应用程序不应该试图修改这个结构或者释放它的任何部分。此外,每一线程仅有一份这个结构的拷贝,所以应用程序应该在发出其他Windows Scokets API调用前,把自己所需的信息拷贝下来。 返回值: 如果没有错误发生,getprotobynumber()返回如上所述的一个指向protoent结构的指针,否则,返回一个空指针。应用程序可以通过WSAGetLastError()来得到一个特定的错误代码。 错误代码: WSANOTINTIALISED 在应用这个API前,必须成功地调用WSAStartup()。 WSAENTDOWN Windows Sockets实现检测到了网络子系统的错误。 WSANO_RECOVERY 无法恢复的错误,FORMERR,REFUSED,NOTIMP。 WSANO_DATA 有效的名字,但没有关于请求类型的数据记录。 WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行。 WSAEINTR 阻塞调用被WSACancelBlockingCall()取消了. 参见: WSAAsyncGetProtoByNumber(), getprotobyname() 5.2.6 getservbyname() 简述: 返回对应于给定服务名和协议名的相关服务信息。 #include <windows.h> struct servent FAR * PASCAL FAR getservbyname(const char Far * name, const char FAR *proto)<I>&#</I>59; name: 一个指向服务名的指针。 proto: 指向协议名的指针(可选)。如果这个指针为空,getservbyname()返回第一个name与s_name或者某一个s_aliases匹配的服务条目。否则getservbyname()对name和proto都进行匹配。 注释: getservbyname()返回与给定服务名对应的包含名字和服务号信息的servent结构指针。结构的声明如下: struct servent { char FAR * s_name<I>&#</I>59; char Far * FAR * s_aliases<I>&#</I>59; short s_port<I>&#</I>59; char FAR * s_proto<I>&#</I>59; }<I>&#</I>59; 结构的成员有: 成员 用途 s_name 正规的服务名。 s_aliases 一个以空指针结尾的可选服务名队列。 s_port 连接该服务时需要用到的端口号,返回的端口号是以网络字节顺序排列的。 s_proto 连接该服务时用到的协议名。 返回的指针指向一个由Windows Sockets实现分配的结构。应用程序不应该试图修改这个结构或者释放它的任何部分。此外,每一线程仅有一份这个结构的拷贝,所以应用程序应该在发出其他Windows Scokets API调用前,把自己所需的信息拷贝下来。 返回值: 如果没有错误发生,getservbyname()返回如上所述的一个指向servent结构的指针,否则,返回一个空指针。应用程序可以通过WSAGetLastError()来得到一个特定的错误代码。 错误代码: WSANOTINTIALISED 在应用这个API前,必须成功地调用WSAStartup()。 WSAENTDOWN Windows Sockets实现检测到了网络子系统的错误。 WSAHOST_NOT_FOUND 没有找到授权应答主机。 WSANO_DATA 有效的名字,但没有关于请求类型的数据记录。 WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行。 WSAEINTR 阻塞调用被WSACancelBlockingCall()取消了. 参见: WSAAsyncGetServByName(), getservbyport() 5.2.7 getservbyport() 简述: 返回对应于给定端口号和协议名的相关服务信息。 #include <windows.h> struct servent FAR * PASCAL FAR getservbyport(int port, const char FAR *proto)<I>&#</I>59; port: 给定的端口号,以网络字节顺序排列。 proto: 指向协议名的指针(可选)。如果这个指针为空,getservbyport()返回第一个port与s_port匹配的服务条目。否则getservbyport()对port和proto都进行匹配。 注释: getservbyport()返回与给定服务名对应的包含名字和服务号信息的servent结构指针。结构的声明与getservbyname()中一致。 返回的指针指向一个由Windows Sockets实现分配的结构。应用程序不应该试图修改这个结构或者释放它的任何部分。此外,每一线程仅有一份这个结构的拷贝,所以应用程序应该在发出其他Windows Scokets API调用前,把自己所需的信息拷贝下来。 返回值: 如果没有错误发生,getservbyport()返回如上所述的一个指向servent结构的指针,否则,返回一个空指针。应用程序可以通过WSAGetLastError()来得到一个特定的错误代码。 错误代码: WSANOTINTIALISED 在应用这个API前,必须成功地调用WSAStartup()。 WSAENTDOWN Windows Sockets实现检测到了网络子系统的错误。 WSAHOST_NOT_FOUND 没有找到授权应答主机。 WSANO_DATA 有效的名字,但没有关于请求类型的数据记录。 WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行。 WSAEINTR 阻塞调用被WSACancelBlockingCall()取消了. 参见: WSAAsyncGetServByPort(), getservbyname() 5.3 Windows扩展函数 5.3.1 WSAAsyncGetHostByAddr() 简述: 获得对应于一个地址的主机信息.-异步版本. #include <winsock.h> HANDLE PASCAL FAR WSAAsyncGetHostByAddr ( HWND hWnd, unsigned int wMsg, const char FAR * addr, int len, int type, char FAR * buf, int buflen )<I>&#</I>59; hWnd 当异步请求完成时,应该接收消息的窗口句柄. wMsg 当异步请求完成时,将要接收的消息. addr 主机网络地址的指针.主机地址以网络字节次序存储. len 地址长度.对于PF_INET来说必须为4. type 地址类型,必须是PF_INET. buf 接收hostent数据的数据区指针.注意该数据区必须大于hostent结构的大小.这是因为不仅Windows Sockets实现要用该数据区域容纳hostent结构,hostent结构的成员引用的所有数据也要在该区域内.建议用户提供一个 MAXGETHOSTSTRUCT字节大小的缓冲区. buflen 上述数据区的大小. 注释: 本函 数是gethostbyaddr()的异步版本,是用来获取对应于一个网络地址的主机名和地址信息.Windows Sockets的实现启动该操作后立刻返回调用方,并传回一个异步任务句柄,应用程序可以用它来标识该操作.当操作完成时,结果(若有的话)将会拷贝到调 用方提供的缓冲区,同时向应用程序的窗口发一条消息. 当异步操作完成时,应用程序的窗口hWnd接收到消息wMsg. wParam参数包含了初次函数调用时返回的异步任务句柄.lParam的高16位包含着错误代码.该代码可以是winsock.h中定义的任何错误.错 误代码为0说明异步操作成功.在成功完成的情况下,提供给初始函数调用的缓冲区中包含了一个hostent结构.为存取该结构中的元素,初始的缓冲区指针 应置为hostent结构的指针,并一如平常地存取. 注意若错误代码为WSAENOBUFS,它说明在初始调用时由buflen指出的缓 冲区大小对于容纳所有的结果信息来说太小了.在这种情况下,lParam的低16位含有提供所有信息所需的缓冲区大小数值.如果应用程序认为获取的数据不 够,它就可以在设置了足够容纳所需信息的缓冲区后,重新调用WSAAsyncGetHostByAddr().(也就是大于lParam低16位提供的大 小.) 错误代码和缓冲区大小应使用WSAGETASYNCERROR和WSAGETASYNCBUFLEN宏从lParam中取出.两个宏定义如下: #define WSAGETASYNCERROR(lParam) HIWORD(lParam) #define WSAGETASYNCBUFLEN(lParam) LOWORD(lParam) 使用这些宏可最大地提高应用程序源代码的可移植性. 返回值: 返回值指出异步操作是否成功地初启.注意它并不隐含操作本身的成功或失败. 若 操作成功地初启,WSAAsyncGetHostByAddr()返回一个HANDLE类型的非0值, 作为请求需要的异步任务句柄.该值可在两种方式下使用.它可通过WSACancelAsyncRequest()用来取消该操作.也可通过检查 wParam消息参数,以匹配异步操作和完成消息. 如果异步操作不能初启,WSAAsyncGetHostByAddr()返回一个0值,并且可使用WSAGetLastError()来获取错误号. WINDOWS SOCKETS 规范及应用评价: Windows Sockets的实现使用提供给该函数的缓冲区来构造hostent结构以及该结构成员引用的数据区内容.为避免上述的WSAENOBUFS错误,应用程序应提供一个至少MAXGETHOSTSTRUCT字节大小的缓冲区. 关于Windows Sockets提供者的说明: Windows Sockets的实现应保证消息能成功地传给应用程序.如果PostMessage()操作失败,Windows Sockets的实现必须重发该消息-只要窗口存在. Windows Sockets的提供者在消息中组织lParam时应使用WSAMAKEASYNCREPLY宏. 错误代码: 在应用程序的窗口收到消息时可能会设置下列的错误代码.如上所述,它们可以通过WSAGETASYNCERROR宏从应答的消息lParam中取出. WSAENETDOWN WINDOWS SOCKETS实现已检测到网络子系统故障. WSAENOBUFS 可用的缓冲区空间不足或没有. WSAHOST_NOT_FOUND 未找到授权应答主机. WSATRY_AGAIN 未找到非授权应答主机,或SERVERFAIL. WSANO_RECOVERY 不可恢复性错误,FORMERR,REFUSED,NOTIMP. WSANO_DATA 合法名,无请求类型的数据记录. 下列的错误可能在函数调用时发生,指出异步操作不能初启. WSANOTINITIALISED 在使用本API前必须进行一次成功的WSAStartup()调用. WSAENETDOWN Windows Sockets的实现已检测到网络子系统故障. WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行. WSAEWOULDBLOCK 本异步操作此时由于Windows Sockets实现的资源或其它限制的制约而无法调度. 参见: gethostbyaddr(), WSACancelAsyncRequest()
转自:
转载地址:http://oicdi.baihongyu.com/