博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于socket()(转)
阅读量:4037 次
发布时间:2019-05-24

本文共 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/

你可能感兴趣的文章
Django 的Error: [Errno 10013]错误
查看>>
机器学习实战之决策树(一)
查看>>
机器学习实战之决策树二
查看>>
[LeetCode By Python]7 Reverse Integer
查看>>
[leetCode By Python] 14. Longest Common Prefix
查看>>
[leetCode By Python]111. Minimum Depth of Binary Tree
查看>>
[LeetCode By Python]118. Pascal's Triangle
查看>>
[LeetCode By Python]121. Best Time to Buy and Sell Stock
查看>>
[LeetCode By Python]122. Best Time to Buy and Sell Stock II
查看>>
[LeetCode By Python]125. Valid Palindrome
查看>>
[LeetCode By Python]136. Single Number
查看>>
[LeetCode By MYSQL] Combine Two Tables
查看>>
如何打开ipynb文件
查看>>
[Leetcode BY python ]190. Reverse Bits
查看>>
Android下调用收发短信邮件等(转载)
查看>>
Android中电池信息(Battery information)的取得
查看>>
SVN客户端命令详解
查看>>
Android/Linux 内存监视
查看>>
Linux系统信息查看
查看>>
用find命令查找最近修改过的文件
查看>>