掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)連接的一端稱為一個(gè)socket。 建立網(wǎng)絡(luò)通信連接至少要一對(duì)端口號(hào)(socket)。socket本質(zhì)是編程接口(API),對(duì)TCP/IP的封裝,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開(kāi)發(fā)所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動(dòng)機(jī),提供了網(wǎng)絡(luò)通信的能力。

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

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流