Socket 端口和服务 - 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网络服务。