为什么UDP客户端端口在UDP服务器上发生变化

时间:2018-01-22 22:22:07

标签: c++ sockets udp

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

从查看代码看,很明显服务器和客户端通过端口8888进行连接:

Client.cpp

nillable="false"

Server.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

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

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

Note how the port changes 注意端口如何从8888

更改

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

enter image description here

注意端口如何再次更改

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

客户端和服务器都将端口置于sockaddr_in结构中。服务器在调用bind()时使用此结构,该sendto()设置侦听端口。客户端在bind()的调用中使用它,因此它设置目标端口。

由于客户端从不调用href="./page"来设置特定的本地端口,因此从短暂的端口范围中任意选择源端口。每个套接字都有一个不同的端口来区分它们。

如果将固定端口用作客户端的本地端口,则无法在同一台计算机上拥有多个客户端,因为无法知道哪个客户端应从服务器接收传入数据包。因此,固定端口通常用于服务器,在客户端上使用随机端口。

答案 2 :(得分:0)

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