1.Socket基本概念介绍
Socket是套接字的英文名称,主要用于网络通信编程。前几天看网络通信,发现有许多概念,诸如同步/异步,阻塞/非阻塞等,感觉迷惑不清,因此就先介绍一下这些概念。
同步方式是指发送方不等接收方响应,便接着发送下个数据包的通信方式;
异步方式是指发送方发出数据后,等到接收方发回响应才发下个数据包的通信方式。
阻塞套接字是指执行此套接字的网络调用时,直到成功才返回,否则一直阻塞在此网络调用上,比如调用Receive()函数读取网络缓冲区中的数据,如果没有数据到达,将一直挂在Receive()这个函数调用上,直到读到一些数据,此函数调用才返回。
非阻塞套接字是指执行此套接字的网络调用,不管是否执行成功,都立即返回,比如调用Receive()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。在实际windows网络通信软件开发中,异步非阻塞套接字使用最多,例如平常所说的C/S(客户端/服务器)结构的软件就是异步非阻塞模式的。
2.Socket编程原理
Socket编程中最常使用的两种协议,即面向连接的TCP协议和无连接的UDP协议。下面结合图示分别来说明(图1是面向连接的,图2是无连接的)
图1面向连接的TCP时序图
对于TCP,步骤如下:
(1)服务器首先启动,然后在某一时刻启动客户机与服务器建立连接。服务器与客户机首先调用Socket()建立一个套接字Socket
(2)服务器调用Bind()将套接字与一个本机指定端口绑定在一起,再调用Listen()使套接字处于一种被动的准备接收状态,这时客户机建立套接字便可以通过调用Connect()和服务器建立连接。
(3)服务器可以调用Accept()方法来接受客户机连接,然后继续侦听端口,并发出阻塞,直到下一个请求出现,从而实现多个客户机连接。
(4)连接建立之后,客户机和服务器之间就可以通过连接发送和接收数据。
(5)等待数据传输结束,双方调用Close()关闭套接字。
图2无连接的UDP时序图
对于UDP,客户机并不与服务器建立连接,而仅仅调用函数SendTo()给服务器发送数据报。相似地,服务器也不从客户端接收一个连接,只是调用函数ReceiveFrom(),等待客户端来的数据。依照ReceiveFrom()得到的协议地址以及数据报,服务器就可以给客户发送一个应答。