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