16.3.3 面向连接的套接字编程(www.cppentry.com)
面向连接的套接字用于实现面向连接的协议。面向连接套接字在建立连接或接收连接请求前,需要使用WSPBind()函数将套接字绑定到本地地址上或隐式的调用WSPConnect()函数。即面向连接套接字是需要维护链接的,其结构类似于客户端/服务器。服务器端首先创建套件字,将其绑定到已知的本地端口,并使用WSPListen()函数设置套接字处于监听状态,等待客户端的请求,并指定连接的队列。服务器端套接字会使用WSPAccept()函数接收客户端套接字连接,并将其放置到客户端队列中,同时创建新的对应的套接字,与客户端套接字进行数据传输和交互。
客户端会创建相应的套接字,使用WSPConnect()函数指定服务器地址和端口初始化连接。通常客户端不需要使用绑定操作初始化连接,而是由服务器端完成隐式地绑定。同时,如果客户端使用阻塞模式,则WSPConnect()函数会阻塞,直到服务器端接收连接或拒绝连接才会返回。
在调用WinSokcet API函数时,需要注意本地地址和远程地址的用法。使用WSPGet SockName()函数可以获取用于绑定的本地地址。尤其是在没有调用WSPBind()函数的情况下,调用WSPConnect()函数,最好使用此函数获取本地地址。在建立连接后,使用WSPGetPeerName()函数可以确定远程套接字的地址。
对于面向连接的套接字,在建立连接后,就可以使用发送函数和接收函数执行相应的发送操作和接收操作。通信完成后,还需要断开连接。显式地处理套接字连接是一个良好的习惯,对于编写高效、稳定的通信程序是非常重要的一环。
断开套接字连接可以使用WSPShutdown()函数、WSPSendDisconnect()函数或WSP CloseSocket()函数。其中,WSPSendDisconnect()函数发送断开连接到远程套接字后断开连接,推荐使用此函数断开套接字连接。需要注意,在WSPRecv()函数返回WSAECONNR ESET时,表示套接字已经断开,在判断到此返回值时,本地套接字也应该做相应的断开套接字的处理。