我一直在关注一个简单的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
然而,当我实际运行服务器和客户端时,服务器说客户端连接端口总是不同的:
首次运行(服务器日志):
更改第二次运行(服务器日志)
注意端口如何再次更改
为什么连接的端口会从8888变化?
答案 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位数端口是为最终从服务器返回数据而创建的客户端端口。这是一种自动且完全正常的机制。