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網路服務。


上一篇: Socket 結構 下一篇: Socket 網路位元組順序