linux套接字編程

      套接字是用來進行主機間通訊的,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.否則,該客戶端的工作已經完成,可以關閉與該客戶端的連接

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章