Unix套接字 - 端口和服务



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

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

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

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

通常的做法是分配大于5000的任何端口号。但是,许多组织已经编写了端口号大于5000的服务器。例如,雅虎通运行在5050端口,SIP服务器运行在5060端口,等等。

端口和服务示例

这是一个服务和相关端口的小列表。您可以在IANA - TCP/IP端口分配找到最新的Internet端口和相关服务的列表。

服务 端口号 服务描述
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窗口(注意:>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 别名 它保存服务别名的列表。大多数情况下,它将设置为NULL。
s_port 80 它将包含关联的端口号。例如,对于HTTP,它将是80。
s_proto

TCP

UDP

它设置为使用的协议。Internet服务使用TCP或UDP提供。
广告