socket端口与服务

yiibai

当一个客户端程序要连接服务器时,客户端必须有​​识别要连接的服务器的一种方式。因此客户端知道可以连接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 回射
discard 9 UDP/TCP 丢弃输入
daytime 13 UDP/TCP返回ASCII码的时间
chargen 19 UDP/TCP 返回的字符
ftp 21 TCP 文件传输
telnet 23 TCP 远程登录
smtp 25 TCP 电子邮件
daytime 37 UDP/TCP 返回的二进制时间
tftp 69 UDP 简单文件传输
finger 79 用户TCP信息
http 80 TCP 万维网
login 513 TCP 远程登录
who 513 UDP 用户不同信息
Xserver 6000 TCP窗口(注:> 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网络服务。

你可能感兴趣的:(socket端口与服务)