當(dāng)客戶端進(jìn)程想要連接服務(wù)器時(shí),客戶端必須有一種方法來(lái)識(shí)別它想要連接的服務(wù)器。如果客戶端知道服務(wù)器所在主機(jī)的32位Internet地址,它就可以與該主機(jī)聯(lián)系。但是客戶端如何識(shí)別運(yùn)行在該主機(jī)上的特定服務(wù)器進(jìn)程呢?
為了解決識(shí)別主機(jī)上運(yùn)行的特定服務(wù)器進(jìn)程的問(wèn)題,TCP和UDP都定義了一組眾所周知的端口。
對(duì)于我們的目的,端口將被定義為1024到65535之間的整數(shù)。這是因?yàn)樗行∮?024的端口號(hào)都被認(rèn)為是眾所周知的——例如,telnet使用端口23,http使用端口80,ftp使用端口21,等等。
網(wǎng)絡(luò)服務(wù)的端口分配可以在/etc/services.文件中找到如果您正在編寫(xiě)自己的服務(wù)器,那么必須注意為您的服務(wù)器分配端口。您應(yīng)該確保該端口不應(yīng)分配給任何其他服務(wù)器。
通常的做法是分配任何超過(guò)5000的端口號(hào)。但也有許多組織編寫(xiě)了端口號(hào)超過(guò)5000的服務(wù)器。例如,Yahoo Messenger運(yùn)行在5050,SIP Server運(yùn)行在5060,等等。
端口和服務(wù)示例
下面是一個(gè)服務(wù)和相關(guān)端口的小列表。您可以在IANA - TCP/IP端口分配中找到最新的internet端口和相關(guān)服務(wù)列表。

端口和業(yè)務(wù)功能
Unix提供以下函數(shù)從/etc/services文件中獲取服務(wù)名。
struct servent *getservbyname(char *name, char *proto)? -?這個(gè)調(diào)用接受服務(wù)名和協(xié)議名,并返回該服務(wù)對(duì)應(yīng)的端口號(hào)。
struct servent *getservbyport(int port, char *proto)?-?這個(gè)調(diào)用接受端口號(hào)和協(xié)議名,并返回相應(yīng)的服務(wù)名。
每個(gè)函數(shù)的返回值都是一個(gè)指向結(jié)構(gòu)體的指針,其形式如下所示
struct servent {
? char *s_name;
? char **s_aliases;
? int s_port;
? char *s_proto;
};
下面是成員字段的描述
屬性:s_name,值:http,描述:這是該服務(wù)的正式名稱。例如SMTP、FTP、POP3等。
屬性:s_aliases,值:ALIAS,描述:它保存服務(wù)別名列表。大多數(shù)情況下,它將被設(shè)置為NULL。
屬性:s_port,值:80,描述:它將具有關(guān)聯(lián)的端口號(hào)。例如,對(duì)于HTTP,它將是80。
屬性:s_proto,值:TCP、UDP,描述:設(shè)置為所使用的協(xié)議。Internet服務(wù)使用TCP或UDP提供。