Unix Socket - 端口和服务

当客户端进程想要连接服务器时,客户端必须有一种方法来识别它想要连接的服务器。如果客户端知道服务器所在主机的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提供。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容