我一直在关注此处找到的简单 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
Run Code Online (Sandbox Code Playgroud)
服务器.cpp
#define BUFLEN 512 //Max length of buffer
#define PORT 8888 //The port on which to listen for incoming data
Run Code Online (Sandbox Code Playgroud)
然而,当我实际运行服务器和客户端时,服务器说客户端连接的端口总是不同的:
首次运行(服务器日志):
第二次运行(服务器日志)
再次注意端口如何变化
为什么连接的端口会从8888改变?
客户端的评论不正确。他们只是从服务器复制了该行,但他们应该将其更改为:
#define PORT 8888 //The port to send outgoing data to
Run Code Online (Sandbox Code Playgroud)
客户端和服务器都将端口放入一个sockaddr_in结构中。服务器在调用时使用此结构bind()设置侦听端口。客户端在对 的调用中使用它sendto(),因此它设置目标端口。
因为客户从来不打电话bind()设置特定的本地端口,因此源端口是从临时端口范围中任意选择的。每个套接字都有一个不同的端口来区分它们。
如果使用固定端口作为客户端的本地端口,则同一台计算机上将无法拥有多个客户端,因为无法知道哪个客户端应该接收来自服务器的传入数据包。因此,固定端口通常用于服务器,随机端口用于客户端。