新聞中心
網(wǎng)絡(luò)上的兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換,這個連接的一端稱為一個socket。 建立網(wǎng)絡(luò)通信連接至少要一對端口號(socket)。socket本質(zhì)是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動機,提供了網(wǎng)絡(luò)通信的能力。

成都創(chuàng)新互聯(lián)專注于成都網(wǎng)站設(shè)計、網(wǎng)站制作、網(wǎng)頁設(shè)計、網(wǎng)站制作、網(wǎng)站開發(fā)。公司秉持“客戶至上,用心服務(wù)”的宗旨,從客戶的利益和觀點出發(fā),讓客戶在網(wǎng)絡(luò)營銷中找到自己的駐足之地。尊重和關(guān)懷每一位客戶,用嚴(yán)謹?shù)膽B(tài)度對待客戶,用專業(yè)的服務(wù)創(chuàng)造價值,成為客戶值得信賴的朋友,為客戶解除后顧之憂。
socket通信方式是進程通信的一種,先列舉一下進程通信的種類:1)管道:管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動,而且只能在具有親緣關(guān)系的進程之間使用。進程的 親緣關(guān)系通常是指父子進程關(guān)系。2)有名管道(FIFO):有名管道也是半雙工的通信方式,但是允許在沒有親緣關(guān)系的進程之間使用,管道是先進 先出的通信方式。3)信號量:信號量是一個計數(shù)器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程 正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內(nèi)不同線程之間的同步手 段。4)消息隊列:消息隊列是有消息的鏈表,存放在內(nèi)核中并由消息隊列標(biāo)識符標(biāo)識。消息隊列克服了信號傳遞信息 少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點。5)信號 ( sinal ) :信號是一種比較復(fù)雜的通信方式,用于通知接收進程某個事件已經(jīng)發(fā)生。6)共享內(nèi)存( shared memory) 共享內(nèi)存就是映射一段能被其他進程所訪問的內(nèi)存,這段共享內(nèi)存由一個進程創(chuàng)建,但多個進程都可以訪問。共享內(nèi)存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設(shè)計的。它往往與其他通信機制 如信號量,配合使用,來實現(xiàn)進程間的同步和通信。7)套接字( socket ) :套接字也是一種進程間通信機制,與其他通信機制不同的是,它可用于不同機器間的進程 通信。
對于socket來說可以用于不同機器間的進程通信,一般情況下使用socket比較多,常見的接口有socket、bind、listen、connect、accept、send、recv、close.這里不對具體函數(shù)的處理進行細說,只對某些細節(jié)進行描述。
1:對于服務(wù)端來函數(shù)調(diào)用的順序是 socket –> bind –> listen ->accept
首先使用socket函數(shù)創(chuàng)建一個socket描述符,創(chuàng)建后可以使用setsockopt設(shè)置socket選項,常見選項:SO_REUSEPORT設(shè)置這個選項可以重復(fù)使用端口號,例如如果TCP連接處于TIME_WAIT狀態(tài),則在2MSL時間內(nèi)無法重復(fù)使用這個端口 這樣如果現(xiàn)在有服務(wù)器嘗試 bind這個端口就會失敗,使用這個選項就可以解決這個問題.TCP_NODELAY關(guān)閉TCP的Nagle,缺省情況下Nagle算法是使能的.
2:使用listen函數(shù)來偵聽socket上的連接請求,函數(shù)原型是:
int listern(int sockfd ,int backlog)其中的第二個參數(shù) backlog的作用是指定偵聽socket最大未完成的連接個數(shù),對于INET的TCP來說,server收到 來自客戶端的連接請求后,為該連接請求新創(chuàng)建一個SOCKET,并且把該SOCKET放到接收連接的隊列中;當(dāng)連接建 立后,把新創(chuàng)建的SOCKET從接收隊列中清除。如果在某種情況下應(yīng)用層來不及調(diào)用accept()接收連接,而此時有 很多客戶端在向server發(fā)起連接,就可能使server端接收連接隊列無限增長,為防止這種情況,在listen函數(shù)中 指定對server端的SOCKET的接收隊列長度的限制。默認值為128,設(shè)置大于128時實際取值128。如果server端的 接收連接的socket接收隊列超過backLog的值,則新的連接請求被拒絕。
3:消息發(fā)送接收函數(shù)
TCP用send 和 recv:這是因為每個TCP都有一個連接,每次連接完成后,都會把連接的信息記錄在socket中,這 樣每次收發(fā)數(shù)據(jù)都知道對方和自己的IP地址還有端口號,無需再次指定。記錄是發(fā)生在accept和connect調(diào)用完 成后。1)connect 調(diào)用因為只有一個socket連接,就記錄在本地。2)而對于accept由于有多個連接,所以accept會返回一個socket對象,對應(yīng)一個TCP連接,記錄對應(yīng)的IP和端口
UDP 利用 sendto() 和 recvfrom()1)recvfrom 會返回發(fā)送端的地址,這樣對服務(wù)器來說,由于是UDP socket對象沒有記錄對應(yīng)的IP和端口信息, 會需要使用用到改地址給客戶端帶來響應(yīng)。對于客戶端,由于每次始終是知道服務(wù)器IP地址和端口(和一個服務(wù)器交互),所以無需記錄(除非UDP客戶端 需要和多個服務(wù)器交互,需要一一記錄,才能確保交互正確)2)sendto由于沒有記錄IP 和端口在 socket 對象中,所以每次都需要指定接受方地址,無論是客戶端和服務(wù)器都需要用
4:socket與epoll結(jié)合使用
在進程通信中,經(jīng)常使用socket與epoll相結(jié)合的方式處理連接請求和消息發(fā)送,首先服務(wù)器創(chuàng)建socket描述符, 使用bind綁定指定端口,并發(fā)起監(jiān)聽,然后將socket描述符放到epoll中,這樣客戶端的連接請求就可以由epoll來 通知socket服務(wù)端,如果有客戶端的連接請求后,使用accept函數(shù)創(chuàng)建新的描述符,并將這個新的描述符放入epoll 中這個新的socket描述符是用來監(jiān)聽客戶端發(fā)來的消息的,如果有消息可讀,那么就可以死循環(huán)使用recv函數(shù)讀取 消息,直到數(shù)據(jù)讀完。
本文題目:簡單介紹一下Socket通信
當(dāng)前鏈接:http://fisionsoft.com.cn/article/dhjeojj.html


咨詢
建站咨詢
