在本篇博文中我将介紹如何寫一個Web Server.博文中大部分資料我是參考的這篇文章(http://www.linuxhowtos.org/C_C++/socket.htm),英文不錯的同學可以參考這篇文章。
程序間通信
在作業系統中,進行通信的實際上是程序而不是程式,程序可以被認為是運作在端系統中的程式。當程序運作在相同的端系統的時候,他們使用程序間通信機制互相通信。程序間互相通信的規則是由端系統上的的作業系統确定的。
-
客戶機和伺服器程序
網絡應用程式是由成對的程序組成,這些程序通過網絡互相發送封包。在C/S架構的應用程式中,一個客戶機浏覽程序與一台伺服器程序交換封包。在一個P2P檔案共享系統中,檔案從一個對等方的程序傳送到另一個對等方的程序,在每對通信程序中我們通常将這兩個程序标示為客戶機(client),而另一個程序标示伺服器(server)。在Web中浏覽器程序是一個客戶機程序,Web伺服器是伺服器程序。對于P2P檔案共享。下載下傳檔案的對等方被标示為客戶機,上載檔案的對等發被标示為伺服器。
在P2P檔案共享等應用中,一個程序即可能是客戶機也可能是伺服器,實際上在一個P2P檔案共享系統中,一個程序既能上載檔案也下載下傳檔案,但無論如何,在一對通信程序中,我們任然能标示客戶機和伺服器,我們定義客戶機和伺服器程序如下:
在給定的一對程序之間的通信會話,發起通信的程序被标示為客戶機,在會話開始等待聯系的程序是伺服器。
-
程序與計算機網絡之間的接口(socket)
多數的應用程式是由通信程序組成的,每對中兩個程序互相發送封包,從一個程序向另一個程序發送的封包必須通過網絡發送,程序通過套接字(socket)的軟體接口在網絡上發送和接收封包。程序相當于一座房子,當一個程序向另一台程序發送封包時,它将封包推出門(套接字),該發送程序到另一接收程序有用于運輸的基礎設施,該設施将封包傳送到目的程序的門口,一旦目的封包抵達到目的主機,目地封包通過門(套接字)傳遞,然後接收程序對封包進行處理。下圖表示兩個主機程序通過套接字通信:
-
套接字(socket)類型
當套接字程序被建立之後,需要執行個體化位址域和套接字的類型,擁有相同的位址域和相同的套接字類型的程序才能夠互相通信;有兩個廣泛使用的位址域。
1.unix domain: 兩個程序通過共享一個共同的檔案系統來通信。
2.Internet domain: 兩個程序通過網際網路通信 。
在unix domain中套接字的位址是由字元串組成的,用于進入檔案系統; 在Internet domain 中套接字的位址是主機在網際網路上的IP位址。
有兩種廣泛使用的套接字類型:
1.stream sockets: 通過字元流的方式進行通信
2.datagram sockets:一次讀取所有的資訊
stream sockets 和 datagram都有各自的運輸層協定,stream sockets使用TCP協定(TCP協定是面向連接配接,并且為兩個端系統之間的資料流動提供可靠的位元組流通道); datagram sockets 使用UDP協定(UDP是無連接配接的,從一個端系統向另一個端系統發送獨立的資料分組,不對傳遞提供任何保證)。
-
端口
然而套接字通信還需要主機上的端口号,端口号是由十六位的無符号整型組成的,在Unix中端口号較小的都被标準服務使用了,例如21号端口就是FTP服務的端口号;但是端口号大于2000的我們是可以使用的。
-
介紹完這些基礎的知識之後,下篇将通過客戶機和伺服器的代碼來對套接字通信的過程做更加深刻的分析
轉載于:https://www.cnblogs.com/gcMerge/p/4903410.html