📜  Unix套接字-端口和服务

📅  最后修改于: 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.