服务器与客户端进程之间端口号联系

来源:互联网 发布:卡尔波普尔 知乎 编辑:程序博客网 时间:2024/05/20 04:28
    服务器和客户端都有端口号,但是,服务器的端口号是重要的,因为客户端只有了解了服务器的地址和端口号,才可以连接到它(即使是采用UDP传输数据,也需要指定发送目标的地址和端口号);而客户端的端口号是无关紧要的,一般由操作系统自动分配。

    服务端怎么知道和客户端的哪个进程连接???
    ---------------------------------------------------------
    对于TCP,服务器在客户端连接后,会在监听套接字之外另外生成一个新的套接字,表示与客户端的连接,这个套接字了解客户端的地址和端口号,从而可以区分是哪个客户端;

    对于UDP,服务器在收到UDP数据时,也了解数据来自什么地址和端口,也可以区分是哪个客户端。

 从基本的网络概念来说,网络层(IP)负责两个主机间的通信,用IP地址区分主机;传输层(TCP和UDP)处理两个进程间(可以是在同一台机器中的两个进程,也可以是不同主机中的两个进程)的通信,用端口号区分进程。两者合起来就是,用 IP地址+传输层协议+端口号 来区分与谁进行通信。(传输层协议就是指TCP或者UDP,也可以是别的传输层协议,因为互联网协议栈是个开放的结构,其他传输层协议也可以利用IP作为网络层提供的服务)

    不论是服务器编程还是客户端编程,其中设置的主机(ip地址),端口号都是服务器端的ip和端口号。客户端的端口号由系统自动分配。客户端端口号和服务器端的端口号没必要相同。服务器要监听客户机的链接,所以需要人为的设置绑定端口。这样客户端才能根据ip地址和端口号访问服务器。服务器端的accept()函数接收到客户端连接时,便重新建立一个socket,这个socket里面含有客户端的地址和端口号信息,以此实现服务器和客户端的通信。 侦听端口是服务器向客户端所开放的端口,也就是客户端要连接服务器需要的目标端口。通信端口是客户端去访问服务器端口时所携带的源端口,这两个端口号是不一样的,服务端侦听的端口号一般是固定的,而客户端的通信源端口号是随机产生的。

如果想自己指定客户端的端口,那么可以向在服务端一样,在socket()创建客户端套接字后,调用一下bind()函数来绑定本机端口。然后在调用connect()函数绑定服务器的主机和端口。


原创粉丝点击