套接字是用來進行主機間通訊的,linux的socket和windows差不多,雖然有一定的區別,但是其基本原理與結構是一樣的,因此,一臺windows的主機可以和一臺linux的主機通過套接字進行通訊。socket採用客戶端與服務器端的模式使兩臺主機進行通訊。首先,服務器端調用函數socket新建一個套接字,該套接字只能由該進程所有。然後服務器段進程對socket進行命名,本地套接字將被賦予一個文件名,該文件通常保存在/tmp或者/usr/tmp下。對於網絡套接字,名字將是一個與所連接的網絡有關的能夠被客戶端連接上的端口號。套接字命名的函數是bind。然後服務器段調用函數listen來等待客戶端的連接,並對進入的連接組成一個隊列。服務器端調用函數accept接受連接。
當連接被接受後,將新建一個套接字來進行與該客戶端的通訊,而原來的套接字將保留以供進行和其它客戶端的連接。
客戶端的socket連接更加直接,首先新建一個未命名的套接字,然後調用函數connect來對已經具有命名套接字的服務器端進行連接。
套接字的性質主要分爲三方面:域,類型和協議。
域指定了socket通訊使用的網絡媒介,最常用的socket域是代表互聯網絡的AF_INET,在該域下使用的協議是IP。AF_UNIX域適用於單獨的一臺計算機上的socket通訊,這種情況下使用的協議是文件輸入/輸出。還有AF_ISO和AF_XNS兩種域分別對應於ISO標準網絡和Xerox網絡系統。
套接字的類型包括:流和數據報。流類型的套接字與文件流類似,數據以連續的形式在兩個主機之間進行傳送。而數據報類型的套接字則對傳送的數據的大小有限制。
協議則與其所在的域有關。
下面的例子演示了一個能夠接受多個客戶端的服務器程序,通過調用函數fork在主進程中複製一個子進程,將與特定客戶端通訊的任務交給子進程,主進程仍然能夠接受新的客戶端的連接:
1.首先引用必要的頭文件和定義必要的變量
2.創建客戶端序列,忽略子進程的結束信息,等待客戶端連接
3.接受連接
4.創建子進程,判斷當前進程是否爲子進程
5.如果是子進程,則與客戶端進行通訊
6.否則,該客戶端的工作已經完成,可以關閉與該客戶端的連接