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