📅  最后修改于: 2020-11-05 04:51:44             🧑  作者: Mango
当客户端进程要连接服务器时,客户端必须有一种方法来标识其要连接的服务器。如果客户端知道服务器所在主机的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端口和相关服务的最新列表。
Service | Port Number | Service Description |
echo | 7 | UDP/TCP sends back what it receives. |
discard | 9 | UDP/TCP throws away input. |
daytime | 13 | UDP/TCP returns ASCII time. |
chargen | 19 | UDP/TCP returns characters. |
ftp | 21 | TCP file transfer. |
telnet | 23 | TCP remote login. |
smtp | 25 | TCP email. |
daytime | 37 | UDP/TCP returns binary time. |
tftp | 69 | UDP trivial file transfer. |
finger | 79 | TCP info on users. |
http | 80 | TCP World Wide Web. |
login | 513 | TCP remote login. |
who | 513 | UDP different info on users. |
Xserver | 6000 | TCP X windows (N.B. >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;
};
这是成员字段的描述-
Attribute | Values | Description |
---|---|---|
s_name | http | It is the official name of the service. For example, SMTP, FTP POP3, etc. |
s_aliases | ALIAS | It holds the list of service aliases. Most of the time, it will be set to NULL. |
s_port | 80 | It will have the associated port number. For example, for HTTP, it will be 80. |
s_proto |
TCP UDP |
It is set to the protocol used. Internet services are provided using either TCP or UDP. |