【问题标题】:Why does the UDP client port change on the UDP server为什么 UDP 服务器上的 UDP 客户端端口会改变
【发布时间】:2018-01-22 22:22:07
【问题描述】:

我一直在关注here 找到的一个简单的 UDP 服务器/客户端教程,我有一个关于客户端连接到服务器的端口的快速问题。

从代码来看,很明显服务器和客户端是通过8888端口连接的:

客户端.cpp

#define SERVER "127.0.0.1"  //ip address of udp server
#define BUFLEN 512  //Max length of buffer
#define PORT 8888   //The port on which to listen for incoming data

服务器.cpp

#define BUFLEN 512  //Max length of buffer
#define PORT 8888   //The port on which to listen for incoming data

但是,当我实际运行服务器和客户端时,服务器说客户端连接的端口总是不同的:

首次运行(服务器日志):

注意端口从 8888 的变化

第二次运行(服务器日志)

注意端口如何再次变化

为什么连接的端口会从 8888 改变?

【问题讨论】:

标签: c++ sockets udp


【解决方案1】:

客户端中的注释不正确。他们只是从服务器复制了该行,但他们应该将其更改为:

#define PORT 8888   //The port to send outgoing data to

客户端和服务器都将端口放在sockaddr_in 结构中。服务器在调用bind() 时使用这个结构,它设置了监听端口。客户端在对sendto() 的调用中使用它,因此它设置了目标端口。

由于客户端从不调用bind()来设置特定的本地端口,因此源端口是从临时端口范围中任意选择的。每个套接字都有一个不同的端口来区分它们。

如果使用固定端口作为客户端的本地端口,您将无法在同一台机器上拥有多个客户端,因为无法知道哪个客户端应该接收来自服务器的传入数据包。所以服务器端一般使用固定端口,客户端使用随机端口。

【讨论】:

    【解决方案2】:

    当从一台计算机向另一台计算机发送 UDP 数据包时,涉及两个端口:接收计算机的 UDP 套接字绑定到并正在接收的端口(在您的情况下为 8888),以及发送计算机的端口从发送。您看到更改的端口是发送计算机用来发送 UDP 数据包的端口。由于发送计算机从不明确选择要绑定的 UDP 端口(即它从不使用非零参数调用 bind()),发送计算机的 TCP 堆栈只是选择当前可用的 UDP 端口来隐式绑定发送 UDP 套接字到,并且每次运行发送程序时,此端口可能不同。

    【讨论】:

      【解决方案3】:

      8888 是服务器端口。您在日志中看到的 5 位端口是为最终从服务器取回数据而创建的客户端端口。这是一个自动且完全精细的机制。

      【讨论】:

        猜你喜欢
        • 2020-06-22
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-24
        • 2012-03-27
        相关资源
        最近更新 更多