预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共18页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

18.3|Windows套接字技术 套接字(Socket)是网络通信的基本构件,最初是由加利福尼亚大学Berkeley学院为UNIX开发的网络通信编程接口,它只能运行在UNIX操作系统,不支持DOS和Windows操作系统。随着Windows操作系统的日益推广,90年代初,微软和第三方厂商共同制定了一套标准,即WindowsSocket规范,简称WinSock。本节将介绍有关Windows套接字的相关技术。 18.3.1套接字概述 套接字的概念与文件句柄类似,一个套接字就是一个通信标识,由一个短整数表示,实际上就是一个句柄,代表网络协议中的一组数据,该数据包含了通信双方的IP地址和当前的连接状态等信息。我们知道,如果一个文件被打开,可以通过文件句柄对文件进行读写操作,套接字也一样,只不过套接字提供的函数更多一些。 套接字存在于通信区域中,由协议、地址、端口来描述并惟一确定,根据传输协议的不同,套接字可分为3种类型:流式套接字、数据报套接字和原始套接字。流式套接字提供了一个面向连接的、可靠的、数据无错且按顺序接收的服务,这种套接字对应的是面向连接的传输协议,如TCP/IP协议簇中的TCP。数据报套接字提供了一个无连接服务,不提供无错保证,数据可能丢失或重复,且接受顺序混乱,该套接字所对应的是无连接传输协议,如TCP/IP协议簇中的UDP。原始套接字允许直接访问低层的协议,如IP、ICMP协议,该套接字常用于访问服务器中配置的新设备。 18.3.2WinSockAPI相关函数 WinSock提供了许多套接字函数,它们并不代表协议的某一个层次,其实质就是一组编程接口,用户利用这些函数可以很容易地进行编程。 (1)socket函数 socket函数用于创建一个套接字。 语法: SOCKETsocket( intaf, inttype, intprotocol ); af:标识一个地址家族,通常为AF_INET。 type:标识套接字类型,如果为SOCK_STREAM,表示流式套接字;如果为SOCK_DGRAM,表示数据报套接字。 protocol:标识一个特殊的协议被用于这个套接字,通常为0,表示采用默认的TCP/IP协议。 (2)accpet函数 accpet函数用于接受客户端的连接请求。返回值是一个新的套接字,它对应于已经接受的客户端连接,对于该客户端的所有后续操作,都应使用这个新的套接字。 语法: SOCKETaccept( SOCKETs, structsockaddrFAR*addr, intFAR*addrlen ); s:是一个套接字,它应处于监听状态。 addr:是一个sockaddr_in结构指针,包含一组客户端的端口号、IP地址等信息。 addrlen:用于接收参数addr的长度。 (3)bind函数 bind函数用于将套接字绑定到一个已知的地址上。如果函数执行成功,返回值为0,否则为SOCKET_ERROR。 语法: intbind( SOCKETs, conststructsockaddrFAR*name, intnamelen ); s:是一个套接字。 name:是一个sockaddr结构指针,该结构中包含了要绑定的地址和端口号。 namelen:确定name缓冲区的长度。 在定义一个套接字后,需要调用bind函数为其指定本机地址、协议和端口号。 例如,创建一个套接字s,将其绑定到3010端口上,其代码如下: intport=3010; SOCKETs=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); sockaddr_inaddr; addr.sin_family=AF_INET;//内部网络协议TCP/UDP等 addr.sin_port=htons(port);//端口号 addr.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(s,(LPSOCKADDR)&addr,sizeof(addr))==0) { MessageBox("成功"); } (4)closesocket函数 closesocket函数用于关闭某个套接字。 语法: intclosesocket( SOCKETs ); s:标识一个套接字。如果参数s设置有SO_DONTLINGER选项,则调用该函数后会立即返回,但此时如果有数据尚未传送完毕,会继续传递数据,然后才关闭套接字。 (5)connect函数 connect函数用于发送一个连接请求。如果函数执行成功,返回值为0,否则为SOCKET_ERROR。用户可以通过WSAGetLastError得到其错误描述。 语法: intconnect( SOCKETs, conststructsockaddrFAR*name,