建立tcp连接的时候
服务器端执行流程
- 调用socket函数,建立一个套接字,该套接字用于接下来的网络通信
- 调用bind函数,将该套接字绑定一个地址和端口号
- 调用listen函数,使用该套接字监听连接请求
- 调用accept函数,接受该套接字连接请求
客户端执行流程
- 调用socket函数,创建一个套接字
- 调用connect函数,使用该套接字与服务器进行连接
服务器端和客户端程序的显著区别在于客户端程序不需要调用bind函数,bind函数的作用是将套接字绑定一个IP地址和端口号。如果套接字没有使用bind函数绑定地址和端口,那么调用listen函数和connect函数的时候内核会自动为套接字绑定。由此可知,如果没有使用bind函数,也是可以的。看起来好像bind函数是多余的,但事实并不是这样。
我们先来看看listen函数和connect是怎么绑定套接字的,使用的是当前系统中空闲端口的套接字。
这样的话,服务器端的程序不关心客户端的IP地址,也就说是对应的端口号是内核临时指派的一个端口,是随机的,每次执行服务器程序的时候,使用的都是不同的端口。但是在客户端是需要指定通信的服务器的端口的,如果不使用bind函数,每次的端口是随机的话,那么每次重启服务程序之后都要对客户端的程序进行调整,这样做不仅不合理,而且工作量很大,因此在服务器端bind函数作用非常重要