WinSocket 编程
套接字
套接字指通信双方在通信时所使用的通信点(Endpoint),通信的双方通过通信点来交换信息和数据。不同类型的通信会使用不同的类型通信点,比如对于电话通信而言,通信点就是电话号码和分机号码的组合,这时因为如果你想和朋友通话,就需要拨打你朋友的电话号码和分机号码。对于IP网络通信而言,通信点就是套接字,即两个进程在进行网络通信的时候,他们通过套接字来交换信息和数据。
和电话通信类似,当一个进程想和另一个进程进行网络通信时,它必须知道另外一个进程所在的目标机器IP地址,同时也必须有一种机制来标识目标机器上的进程,这种机制就是我们前面章节提到的端口号,目标机器正是通过端口号才能确定应该把接收到的数据发往哪一个进程。也就是说套接字这种通信点必须通过端口号标识和IP地址,另外由于网络通信也有不同类型,同一个端口号在使用不同的传输层协议时含义是不一样的,所以套接字还和传输层协议有关。
一个套接字包含:
- IP地址
- 端口号
- 传输协议
一个已连接的TCP套接字对应如下:
【本地IP,端口,目标机IP,端口】
服务器可以分为迭代服务器和并发服务器
迭代服务器工作方式如下(UDP):
- 等待客户请求
- 当接受到客户请求时,处理该请求并把结果返回该客户
- 回到步骤1,继续等待下一个客户请求。
并发服务器的工作方式如下(TCP):
- 等待客户请求
- 当接收到客户请求,为该客户开启一个新的服务器实例(进程、线程等),并且由这个新的服务器实例来处理该客户的请求并把结果返回客户,之后该新的服务器实例就终止。
- 回到步骤一,继续等待下一个客户请求
TCP客户端与服务器交互过程
TCP服务器端连接套接字创建、关闭交互过程说明如下:
- 服务器创建一个套接字。
- 服务器把本地套接字地址(本地IP地址和本地端口)绑定(Bing)到该套接字。客户端将使用在这里的绑定的套接字地址来连接到该服务器
- 服务器把该套接字置为等待状态,也叫(Listen)这时套接字也被称为监听套接字。
- 服务器开始接受(Accept)客户端的连接请求。如果这时没有连接求,则服务器就等待请求的到来;如果有连接请求,则服务器为该连接请求创建一个新的套接字,该新的套接字用来描述这个连接,既它对应于一个四元组:[本地IP地址,本地端口,远程IP地址,远程端口]。我们把这个新的套接字被称为已连接套接字,以便于区分监听套接字。
- 服务器使用已经连接的套接字来接受来自客户端的数据,或者发送数据到客户端。
- 当完成和客户端的数据交互之后,服务器关闭套接字。
一般来说,当服务器创建了已连接套接字后,会生成一个新的服务器实例(线程或进程等)。然后这个新的实例执行5,、6步,即处理和客户端的数据交互。
TCP客户端
TCP客户端连接套接字创建,关闭过程说明
- 客户端创建一个套接字
- 客户端把本地套接字地址(本地IP地址和本地端口)绑定到套接字。注意,这个步骤对于客户端来说不是必须的。如果执行的话就按四元组中的地址分配,如果没有执行则系统自动分配地址。
- 客户端使用在步骤1中创建的套接字来连接(Connect)到一个远程套接字的地址(远程IP地址和远程端口),即服务器的监听套接字地址。在连接成功之后,这个连接将由客户端套接字来描述,这个客户端套接字也对应于一个四元组:[本地IP地址,本地端口,远程IP地址,远端端口]。此时,这个客户端套接字也成为一个连接套接字。
- 客户端使用已连接套接字发送来发送数据到服务器,或者接受来自服务器的数据。
- 当完成和服务器的数据交互之后,客户端关闭连接套接字。
这整个过程都只有一个套接字和一个客户端实例
赌上我的人生为梦想,即使是臭名远扬,也要我的名字响彻天堂