Unix 套接字 - 端口和服务

当客户端进程想要连接服务器时,客户端必须有一种方法来识别它想要连接的服务器。如果客户端知道服务器所在主机的 32 位 Internet 地址,它就可以联系该主机。但客户端如何识别在该主机上运行的特定服务器进程?

为了解决识别在主机上运行的特定服务器进程的问题,TCP 和 UDP 都定义了一组众所周知的端口。

为了实现我们的目的,端口将被定义为 1024 到 65535 之间的整数。这是因为所有小于 1024 的端口号都被视为众所周知 - 例如,telnet 使用端口 23,http 使用 80,ftp 使用 21,等等。

可以在文件 /etc/services 中找到网络服务的端口分配。如果您正在编写自己的服务器,则必须小心为您的服务器分配端口。您应确保此端口不应分配给任何其他服务器。

通常,分配大于 5000 的任何端口号是一种惯例。但有许多组织编写的服务器的端口号超过 5000。例如,Yahoo Messenger 在 5050 上运行,SIP 服务器在 5060 上运行,等等。

示例端口和服务

以下是服务和相关端口的简短列表。您可以在 IANA - TCP/IP 端口分配 中找到最新的互联网端口和相关服务列表。

服务 端口号 服务说明
echo 7 UDP/TCP 返回其收到的内容。
discard 9 UDP/TCP 丢弃输入。
daytime 13 UDP/TCP 返回 ASCII 时间。
chargen 19 UDP/TCP 返回字符。
ftp 21 TCP 文件传输。
telnet 23 TCP 远程登录。
smtp 25 TCP 电子邮件。
daytime 37 UDP/TCP 返回二进制时间。
tftp 69 UDP 简单文件传输。
finger 79 TCP 用户信息。
http 80 TCP 万维网。
login 513 TCP 远程登录。
who 513 UDP 用户不同信息。
Xserver 6000 TCP X windows(注意: >1023)。

端口和服务函数

Unix 提供以下函数从 /etc/services 文件中获取服务名称。

  • struct servent *getservbyname(char *name, char *proto) − 此调用获取服务名称和协议名称,并返回该服务的相应端口号。

  • struct servent *getservbyport(int port, char *proto) − 此调用获取端口号和协议名称,并返回相应的服务名称。

每个函数的返回值都是指向具有以下形式的结构的指针 −

struct servent {
   char  *s_name;
   char  **s_aliases;
   int   s_port;
   char  *s_proto;
};

以下是成员字段的描述 −

属性 描述
s_name http 这是服务的正式名称。例如,SMTP、FTP POP3 等。
s_aliases ALIAS 它保存服务别名的列表。大多数情况下,它将被设置为 NULL。
s_port 80 它将具有关联的端口号。例如,对于 HTTP,它将是 80。
s_proto

TCP

UDP

它设置为使用的协议。互联网服务使用 TCP 或 UDP 提供。