Winsock API函数大全1
副标题#e#
本系统(WinKing)提供之 Windows Sockets API 介面乃是依照 1993年1月20日发布之 WINSOCK 第1.1版(如附录)中所界说之函式 (routine); 包罗了30个Berkeley Software Distribution (BSD) 的函式以及16个切合 Windows Message-driven 特性的函式。
BSD 函式包罗:
accept() bind() closesocket() connect()
getpeername() getsockname() getsockopt() htonl()
htons() inet_addr() inet_ntoa() ioctlsocket()
listen() ntohl() ntohs() recv()
recvfrom() select() send() sendto()
setsockopt() shutdown() socket() gethostname()
gethostbyaddr() gethostbyname()
getprotobyname() getprotobynumber()
getservbyname() getservbyport()
Microsoft Windows-specific Extensions 函式包罗:
WSAAsyncGetHostByAddr() WSAAsyncGetHostByName()
WSAAsyncGetProtoByName() WSAAsyncGetProtoByNumber()
WSAAsyncGetServByName() WSAAsyncGetServByPort()
WSAAsyncSelect() WSACancelAsyncRequest()
WSACancelBlockingCall() WSACleanup()
WSAGetLastError() WSAIsBlocking()
WSASetBlockingHook() WSASetLastError()
WSAStartup() WSAUnhookBlockingHook()
这些 API 介面合用於 Internet Protocol Suite (IPS,凡是称之为 TCP/IP),
支援 Stream (TCP) 及 Datagram (UDP) Socket。
Stream (TCP) Socket 提供「双向」、「靠得住」、「有序次」、「不重覆」之资料传送。
Datagram (UDP) Socket 则提供「双向」之相同,但没有「靠得住」、「有序次」、「不重覆」等之担保; 所以利用者大概会收到无序次、重覆之资料,甚至资料在传输进程中也大概会漏掉。
#p#副标题#e#
[Blocking 与 Non-blocking 模式]
Blocking 模式:利用者呼唤此一模式之函式时,会进入此函式之内部,直到条件或资料完全切适时再回到呼唤点。
Non-blocking 模式:利用者呼唤此一模式之函式时,进入此函式之内部,依其时之条件或资料做适当之回答,并不会逗留在函式之内部到条件或资料完全切合後才回应。
利用者必须留意的是,WINSOCK 界说之 Blocking 模式与一般 Unix 的不太沟通。WINSOCK界说答允应用程式在呼唤 Blocking 函式的同时,依旧可以或许处理惩罚其它讯息 (Messages),包罗Keyboard 及 Mouse 的事件;可是此时应用程式除了能用 WSACancelBlockingCall() 函式来打消原先之 locking 行动或用WSAIsBlocking() 函式来查抄今朝是否有 Blocking 行动仍在举办外,不行以」在原先呼唤之Blocking 函式完成前再呼唤其它的 Socket 函式,否则後者会失败且发生WSAINPROGRESS 的错误。
利用者呼唤 WSACancelBlockingCall()函式所打消的 Blocking 行动若不是accept() 可能 select()的话,那麽之後独一可呼唤的 Socket 函式只有closesocket(),因为打消一个 Socket 的Blocking 行动会使其酿成未定(Indeterminate) 状态。
[Async (非同步) 模式]
利用者呼唤此一模式的函式时,并不会顿时获得要求的资料;而是当要求的行动完成後,系统再透过另一种方法来通知呼唤者。其长处是利用者不需比及答覆後才可以再做其它的行动或要求。
WINSOCK界说的 Async 模式是以「PostMessage」的方法奉告利用者其要求已经完成;所以在呼唤此类函式时,必需奉告 Windows Sockets DLL一些资讯,包罗接管讯息的视窗 handle及讯息编号等。
[函式概说]
[BSD Socket 程式库]
(1) accept():接管某一Socket的毗连要求,以完成 Stream Socket 的毗连。
格 式: SOCKET PASCAL FAR accept( SCOKET s,struct sockaddr FAR *addr,int FAR *addrlen );
参 数: s Socket的识别码 addr 存放来毗连的彼端的位址 addrlen addr的长度
传回值: 乐成 – 新的Socket识别码 失败 – INVALID_SOCKET (呼唤 WSAGetLastError() 可得知原因)
说明: Server 端之应用程式呼唤此一函式来接管 Client 端要求之Socket 毗连行动;假如Server 端之 Socket 是为 Blocking 模式,且没有人要求毗连行动,那麽此一函式会Block 函式顿时回答错误。accept() 函式的答覆值为一新的 Socket,此 Socket 不行再用来接管其它的毗连要求;可是原先之 Socket 仍可接管其他人的毗连要求。
(2) bind():指定 Socket 的 Local 位址 (Address)。
格 式: int PASCAL FAR bind( SOCKET s,const struct sockaddr FAR *name,int namelen );
参 数: s Socket的识别码 name Socket的位址值,其名目为
struct sockaddr
{
u_short sa_family;
char sa_data[14];
};
namelen name的长度
传回值: 乐成 – 0
失败 – SOCKET_ERROR (呼唤 WSAGetLastError() 可得知原因)
说明: 此一函式是指定 Local 位址及 Port 给某一未命名之 Socket。 利用者若不在意位址或 Port 的值,那麽他可以设定位址为 INADDR_ANY,及Port 为 0;那麽Windows Sockets 会自动将其设定适当之位址及 Port(1024 到 5000之间的值),利用者可以在此 Socket 真正毗连完成後,呼唤 getsockname() 来获知其被设定的值。
(3) closesocket():封锁某一Socket。
格 式: int PASCAL FAR closesocket( SOCKET s );
参 数: s Socket 的识别码
传回值: 乐成 – 0
失败 – SOCKET_ERROR (呼唤 WSAGetLastError() 可得知原因)
说明: 此一函式是用来封锁某一 Socket。
若是利用者原先对要封锁之 Socket 设定 SO_DONTLINGER,则在呼唤此一函式後,会顿时回答,可是此一 Sokcet 尚未传送完毕的资料会继承送完後才封锁。
若是利用者原先设定此 Socket 为 SO_LINGER,则有两种环境:
(a) Timeout 设为 0 的话,此一 Socket 顿时从头设定 (reset),未传完或未收到的资料全部遗失。
(b) Timeout 不为 0 的话,则会将资料送完,或是比及 Timeout 产生後才封锁。
(4) connect():要求毗连某一Socket到指定的对方。
格 式: int PASCAL FAR connect( SOCKET s,const struct sockaddr FAR *name,int namelen );
参 数: s Socket 的识别码
name 此 Socket 想要毗连的对方位址
namelen name的长度
传回值:乐成 – 0
失败 – SOCKET_ERROR (呼唤WSAGetLastError()可得知原因)
#p#分页标题#e#
说明: 此函式用来向对方要求成立毗连。若是指定的对方位址为 0 的话,会传回错误值。当毗连成立完成後,利用者即可操作此一 Socket 来做传送或吸收资料之用了。
(5) getpeername():获取已毗连乐成之 Socket 的对方位址。
格 式: int PASCAL FAR getpeername( SOCKET s,struct sockaddr FAR *name,int FAR *namelen );
参 数: s Socket 的识别码
name 此 Socket 毗连的对方位址
namelen name 的长度
传回值: 乐成 – 0
失败 – SOCKET_ERROR (呼唤 WSAGetLastError() 可得知原因)
说明: 此函式可用来取得已毗连乐成的 Socket 的彼端之位址资料。
(6) getsockname():获取 Socket 的 Local 位址资料。
名目: int PASCAL FAR getsockname( SOCKET s,struct sockaddr FAR *name,int FAR *namelen );
参数: s Socket 的识别码
name 此 Socket 的 Local 位址
namelen name 的长度
传回值: 乐成 – 0
失败 – SOCKET_ERROR (呼唤 WSAGetLastError() 可得知原因)
说明: 此函式是用来取得已设定位址或已毗连之 Socket 的本端位址资料。若是此 Socket 被设定为 INADDR_ANY,则需等真正成立毗连乐成後才会传回正确的位址。
(7) getsockopt():要求某一 Socket 今朝状态设定的资料。
名目: int PASCAL FAR getsockopt( SOCKET s,int level,int optname,char FAR *optval,int FAR *optlen );
参数: s= Socket的识别码,level=选项设定的,level=optname 选项名称,optval=选项的设定值,optlen=选项设定值的长度
传回值: 乐成 – 0
失败 – SOCKET_ERROR (呼唤 WSAGetLastError() 可得知原因)
说明: 此函式用来获取今朝 Socket的某些状态设定值。 WINSOCK 提供之 level 只有 SOL_SOCKET 及 IPPROTO_TCP optname则有以下 之选择:(拜见WINSOCK 第 29、30 页之界说)
Value Type
———————————————–
SO_ACCEPTCONN BOOL
SO_BROADCAST BOOL
*SO_DEBUG BOOL
SO_DONTLINGER BOOL
*SO_DONTROUTE BOOL
*SO_ERROR int
*SO_KEEPALIVE BOOL
SO_LINGER struct linger FAR*
SO_OOBINLINE BOOL
*SO_RCVBUF int
SO_REUSEADDR BOOL
*SO_SNDBUF int
SO_TYPE int
TCP_NODELAY BOOL
(* 暗示暂不提供此成果选项)
(8) htonl():将一 32 位元 u_long 的值由 host 的分列方法转换成network 的分列方法。
名目: u_long PASCAL FAR htonl( u_long hostlong );
参数: hostlong 一个 32 位元 host 分列方法的数目
传回值: 一个 32 位元 network 分列方法的数目
说明: 因为 network 的分列方法与 host 的分列方法大概差异,所以我们需要此一函式来做转换。
(9) htons():将一 16 位元u_short 的值由 host 的分列方法转换成network 的分列方法。
格 式: u_short PASCAL FAR htons( u_short hostshort );
参 数: hostshort 一个 16 位元 host 分列方法的数目
传回值: 一个 16 位元 network 分列方法的数目
说明: 因为 network 的分列方法与 host 的分列方法大概差异,所以我们需要此一函式来做转换。
(10) inet_addr():将字串名目标位址转换成 32 位元 unsigned long 的名目。
名目: unsigned long PASCAL FAR inet_addr( const char FAR *cp );
参数: cp 一个代表位址的「点名目」(dotted) 字串
传回值: 乐成 – 一个代表 Internet 位址的 unsigned long
失败 – INADDR_NONE
说明: 此函式将一「点名目」的位址字串转换成合用之Intenet位址。
「点名目」字串可为以下四种方法之任一:
(i) a.b.c.d (ii) a.b.c (iii) a.b (iv) a