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