当前位置:首页 >> 编程开发 >> Visual C++ >> 内容

Winsock API函数大全1

时间:2008/1/5 作者:平凡之路 来源:xuhantao.com 浏览:

本系统(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 则提供「双向」之沟通,但没有「可靠」、「有次序」、「不重覆」等之保证; 所以使用者可能会收到无次序、重覆之资料,甚至资料在传输过程中也可能会遗漏。

[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()可得知原因)

说明: 此函式用来向对方要求建立连接。若是指定的对方位址为 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

相关文章
  • 没有相关文章
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 徐汉涛(www.xuhantao.com) © 2024 版权所有 All Rights Reserved.
  • 部分内容来自网络,如有侵权请联系站长尽快处理 站长QQ:965898558(广告及站内业务受理) 网站备案号:蒙ICP备15000590号-1