Winsock API函数大全1
当前位置:以往代写 > C/C++ 教程 >Winsock API函数大全1
2019-06-13

Winsock API函数大全1

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 的毗连。

#p#副标题#e#

格 式: 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。

#p#副标题#e#

格 式: 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() 可得知原因)

#p#副标题#e#

说明: 此函式可用来取得已毗连乐成的 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

    关键字:

在线提交作业