位置:首頁 > 其他技術 > Socket編程 > 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網絡服務。