当客户端进程想要连接服务器时,客户端必须有一种方法来识别它想要连接的服务器。如果客户端知道服务器所在主机的32位Internet地址,它就可以与该主机联系。但是客户端如何识别运行在该主机上的特定服务器进程呢?
为了解决识别主机上运行的特定服务器进程的问题,TCP和UDP都定义了一组众所周知的端口。
对于我们的目的,端口将被定义为1024到65535之间的整数。这是因为所有小于1024的端口号都被认为是众所周知的——例如,telnet使用端口23,http使用端口80,ftp使用端口21,等等。
网络服务的端口分配可以在/etc/services.文件中找到如果您正在编写自己的服务器,那么必须注意为您的服务器分配端口。您应该确保该端口不应分配给任何其他服务器。
通常的做法是分配任何超过5000的端口号。但也有许多组织编写了端口号超过5000的服务器。例如,Yahoo Messenger运行在5050,SIP Server运行在5060,等等。
端口和服务示例
下面是一个服务和相关端口的小列表。您可以在IANA - TCP/IP端口分配中找到最新的internet端口和相关服务列表。

端口和业务功能
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,描述:设置为所使用的协议。Internet服务使用TCP或UDP提供。