项目来源:登录—专业IT笔试面试备考平台_牛客网
该课程教授了如何使用socket API实现一个基于TCP协议的多进程并发的服务器。实现服务器之前,首先了解一下TCP通信的流程和所要用的各个API。
1.TCP通信流程
TCP通信中,发起连接请求的一端称为客户端,被动接受连接的一端称为服务端。
服务端:
1.创建一个用于监听的套接字
-监听:监听客户端的连接
-套接字:一个socket文件描述符……socket()
2.将这个监听文件的文件描述符和本地IP和端口绑定(也就是绑定socket地址信息)……bind()
-客户端连接服务器的时候使用的就是这个IP和端口
3.设置监听,监听文件描述符开始工作(客户端socket文件给服务端socket文件的读缓冲区发送数据,服务端socket就是监听自己的读缓冲区有无数据,该过程由OS完成)……listen()
-监听本身不接受请求,发现缓冲区有连接后会转去下一步
4.阻塞等待,直到客户端发起连接,接收客户端连接后会产生另一个用于和客户端通信的socket……accept()
5.通信。……Window:recv()/send() Linux:read()/write()
6.通信结束,关闭连接。……close()
为什么监听到请求后要发起另一个socket用于和客户端通信?
假设有两个客户端先后发起连接而用同一个socket接受连接和进行通信,接受第一个客户端连接后socket开始通信,这个时候第二个客户端也发了一个请求过来,socket这边如果接受请求就得同时跟两个客户端进行通信,而socket文件中只能记下一个客户端的地址信息,这不就乱套了吗。因此必须将接受连接的socket和用于通信的socket区分开来,用一个socket专门接受连接,有多少个连接进来就新建多少个socket与之通信。
这也体现了TCP面向连接的特点,即通信只能是一对一的,一个socket对应一个socket。
客户端:
1.创建一个用于通信的套接字。(端口号由os自动分配的)