Unix套接字 - 埠和服務



當客戶端程序想要連線伺服器時,客戶端必須有一種方法來識別它想要連線的伺服器。如果客戶端知道伺服器所在主機的32位Internet地址,它就可以聯絡該主機。但是,客戶端如何識別在該主機上執行的特定伺服器程序呢?

為了解決識別主機上執行的特定伺服器程序的問題,TCP和UDP都定義了一組眾所周知的埠。

出於我們的目的,埠將定義為1024到65535之間的整數。這是因為所有小於1024的埠號都被認為是眾所周知的——例如,telnet使用埠23,http使用80,ftp使用21,等等。

網路服務的埠分配可以在檔案/etc/services中找到。如果您正在編寫自己的伺服器,則必須小心地為您的伺服器分配埠。您應該確保此埠未分配給任何其他伺服器。

通常的做法是分配大於5000的任何埠號。但是,許多組織已經編寫了埠號大於5000的伺服器。例如,雅虎通執行在5050埠,SIP伺服器執行在5060埠,等等。

埠和服務示例

這是一個服務和相關埠的小列表。您可以在IANA - TCP/IP埠分配找到最新的Internet埠和相關服務的列表。

服務 埠號 服務描述
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 X視窗(注意:>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 別名 它儲存服務別名的列表。大多數情況下,它將設定為NULL。
s_port 80 它將包含關聯的埠號。例如,對於HTTP,它將是80。
s_proto

TCP

UDP

它設定為使用的協議。Internet服務使用TCP或UDP提供。
廣告