当前位置: 首页 > 工具软件 > SocketStream > 使用案例 >

SOCKET_STREAM--TCP客户端和服务器端的交互过程

子车超英
2023-12-01

TCP协议是一种面向连接的协议,在数据传输之前必须先建立连接。

服务器大都可以与多个客户保持连接,因此通信过程中需要至少两个套接字

  1. 监听套接字
  2. 已连接套接字

监听套接字:有服务器端调用socket()函数创建,用于等待客户的连接请求

已连接套接字:连接建立是,由系统创建,每当监听套接字收到一个连接请求,系统便会为该连接请求创建一个新的已连接套接字,并用该套接字与客户建立连接,同时用该套接字与客户端之间进行数据交换,已连接套接字绑定的ip地址来源于监听套接字,端口号由系统随机分配。

 

基本通信过程

一,服务器端

1,调用socket函数建立一个套接字,用于监听

2,调用bind函数为套接字绑定端口和ip

3,调用listen函数,设置套接字处于监听状态

4,若程序不退出,则反复执行:

  • 用accpet函数等待客户端连接到来,若有连接请求到来,则用一个新的套接字(已连接套接字)建立起与客户端之间的连接。
  • 使用recv函数与send函数利用新建立的连接与客户端通信
  • 通信完毕使用closesocket函数关闭连接

二,客户端

1,用socket函数建立一个套接字,设定服务器端的ip与端口

2,调用connect函数连接服务器端的指定端口

3,使用recv函数与send函数利用新建立的连接与服务器通信

4,通信完毕使用closesocket函数关闭连接

 

  1. 创建套接字的实质就是请求OS分配通信所需的一些系统资源(存储空间、网络资源、cpu时间等),这些资源的总和用一个称为套接字描述符的整数表示。
  2. 服务器端和客户端创建套接字的用途是不同的,服务器创建的监听套接字,并不用于数据收发。客户端的套接字则有两个用途:1.向服务器发送连接请求 2.进行客户端的数据收发
  3. socket()函数在创建套接字时并未为创建的套接字分配地址,因此需使用bind()函数将套接字绑定到一个指定的地址上。客户端的套接字可以不用绑定地址,当客户端调用connect()函数与服务器建立连接时,系统会为套接字自动分配一个本机ip地址和未使用的端口号。其实,服务器端的监听套接字不绑定地址也不会出现明显的错误,因为当服务器调用listen()时,系统会为监听套接字分配ip地址和临时tcp端口号,因为临时端口号很难被用户知晓,而导致用户无法访问服务器,因此需要绑定制定地址
  4. 在服务器端调用listen()函数将监听套接字设置为监听模式后,便可调用accept()函数接受客户端的连接请求了;客户端则在创建套接字后调用connect()函数发起连接建立过程(三次握手)。1)第一次握手:客户端调用connect向服务器端发送连接请求报文,报文发送后,客户端的tcp连接状态由CLOSED变为SYN_SENT;服务器端调用accept函数,从listen请求的等待队列中取出一个连接请求,为之创建套接字及分配资源,TCP连接状态由LISTEN状态变为SYN_RCVD。2)第二次握手:服务器为连接请求分配资源,向客户端发送SYN=1的确认报文,客户端收到确认报文后,TCP连接状态由SYN_SENT变为ESTABLISHED。3)第三次握手:客户端TCP连接状态变化后,立即对客户端发来的确认发送一个确认,connect函数返回,连接建立成功。客户端收到确认后,TCP连接状态由SYN_RCVD变为ESTABLISHED,accept函数返回。
 类似资料: