本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告

戒除浮躁,读好书,交益友


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:邢红瑞的blog
日志总数:523
评论数量:1142
留言数量:0
访问次数:9694624
建立时间:2004年12月20日




[c++]windows socket函数说明
文章收藏,  网上资源

邢红瑞 发表于 2005/11/15 10:43:03

5.1.23 socket()   简述:     创建一个套接口。    #include <winsock.h>    SOCKET PASCAL FAR socket( int af, int type, int protocol);    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);  addr:指向网络字节顺序地址的指针。  len: 地址的长度,在PF_INET类型地址中为4。  type:地址类型,应为PF_INET。  注释:       gethostbyaddr()返回对应于给定地址的包含主机名字和地址信息的hostent结构指针。结构的声明如下:  struct hostent {   char FAR *        h_name;   char FAR * FAR *  h_aliases;   short             h_addrtype;   short             h_length;   char FAR * FAR *  h_addr_list;   };  结构的成员有:   成员                 用途   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);  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);  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);  name:一个指向协议名的指针。  注释:       getprotobyname()返回对应于给定协议名的包含名字和协议号的protoent结构指针。结构的声明如下:  struct protoent {   char FAR *        p_name;   char Far * far *  p_aliases;   short             p_proto;   };  结构的成员有:   成员                 用途   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);  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);  name:  一个指向服务名的指针。  proto: 指向协议名的指针(可选)。如果这个指针为空,getservbyname()返回第一个name与s_name或者某一个s_aliases匹配的服务条目。否则getservbyname()对name和proto都进行匹配。  注释:       getservbyname()返回与给定服务名对应的包含名字和服务号信息的servent结构指针。结构的声明如下:  struct servent {   char FAR *       s_name;   char Far * FAR * s_aliases;   short            s_port;   char FAR *       s_proto;   };  结构的成员有:   成员                 用途   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);  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 );  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()   


阅读全文(3078) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.061 second(s), page refreshed 144765717 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号