Socket 端口和服务
当一个客户端程序要连接服务器时,客户端必须有识别要连接的服务器的一种方式。因此客户端知道可以连接32位网络地址的主机服务器所在的主机。但是,客户端如何识别特定的服务器在该主机上运行的进程呢?
要解决的问题是要确定一个特定的服务器一台主机上运行的进程,TCP和UDP定义一组众所周知的端口。
对于我们的目的,端口将被定义为1024和65535之间的整数。这是因为所有小于1024的端口号被认为是众所周知的 - 例如telnet使用端口23,HTTP使用80,FTP使用21,依此类推。
在文件/etc/services中可以找到网络服务端口分配。如果你正在写你自己的服务器,那么必须小心分配一个端口连接到服务器。应该确保该端口应该没有被其他的服务器分配到(占用)。
它的做法通常指定端口大于5000。但也有许多机构写自己的服务器端口号大于5000。例如雅虎信使运行端口号为:5050,5060等SIP服务器上运行
端口和服务实例:
这里是一个小的服务和相关端口列表。可以找到最新的互联网端口和相关的服务列表 IANA - TCP/IP Port Assignments.
服务 | 端口号 | 服务描述 |
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; }; |
这里是成员字段的描述:
属性 | 值 | 描述 |
---|---|---|
s_name | http | 这是官方的服务名称。例如SMTP,FTP POP3等。 |
s_aliases | ALIAS | 其将存放服务别名的列表。大部分的时间将被设置为NULL。 |
s_port | 80 | 这将有相关联的端口号。例如HTTP,为80。 |
s_proto |
TCP UDP |
这将被设置为所使用的协议。使用TCP或UDP网络服务。 |