TCP过程
客户端:
- 创建socket
- 绑定ip、端口号到socket字
- 连接服务器,connect()
- 收发数据,send()、recv()
- 关闭连接
服务器端:
- 创建socket字
- 设置socket属性
- 绑定ip与端口号
- 开启监听,listen()
- 接受发送端的连接accept()
- 收发数据send()、recv()
- 关闭网络连接
- 关闭监听
对应关系:
客户端的connect()指向服务器端的accept()
客户端、服务器端的send()/recv()是双向箭头的关系。
客户端不需要bind的原因
采用TCP通信时,客户端不需要bind()他自己的IP和端口号,而服务器必须要bind()自己本机的IP和端口号
因为服务器总是被动方,需要在一个众所周知的端口上等待连接请求,而且作为服务器它的端口号应该是固定的。服务器bind一个端口就表示会在这个端口提供一些特殊的服务。
而客户端它是主动发起方,我们并不关心是客户端的哪个端口和服务器建立了连接。内核会自动为我们分配一个随机的不冲突的端口号,如果我们对客户端bind的话,反而有可能导致端口冲突。
客户端不是不能绑定,是可以绑定,但容易发生端口冲突,所以不建议绑定,即不需要绑定