国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Socket通信過程原理及相關(guān)系統(tǒng)調(diào)用

2015-07-19 06:13王進文四川大學(xué)計算機學(xué)院四川成都610207
中國新技術(shù)新產(chǎn)品 2015年7期
關(guān)鍵詞:端口號服務(wù)器端IP地址

王進文(四川大學(xué)計算機學(xué)院,四川 成都 610207)

Socket通信過程原理及相關(guān)系統(tǒng)調(diào)用

王進文
(四川大學(xué)計算機學(xué)院,四川 成都 610207)

通過介紹Socket的基本組成結(jié)構(gòu)及其發(fā)揮的作用,論述Socket通信的整個過程并用C語言加以簡要實現(xiàn),以闡明Socket通信過程原理及相關(guān)系統(tǒng)調(diào)用。

Socket;網(wǎng)絡(luò)通信;進程通信

1 Socket基本組成結(jié)構(gòu)

Socket是相同主機進程之間或者不同主機進程之間進行通信的主流手段之一,兩臺計算機之間的網(wǎng)絡(luò)通信可以通過在各自的系統(tǒng)中創(chuàng)建一個Socket,進而利用它來實現(xiàn)相互之間的通信。

那Socket究竟是什么呢?一個基本的Socket就是由本機IP,本機進程端口,目的IP,和目的進程端口,以及輸入輸出緩沖組成的一個數(shù)據(jù)結(jié)構(gòu)。其中前四個屬性分別用來標識本機信息和目的計算機的信息,輸入輸出緩沖用來暫存保存通信的數(shù)據(jù)。

2 Socket通信連接步驟

Socket連接建立之前主要進行兩項工作,第一項是連接建立前的兩個Socket的初始化工作,第二個是兩臺計算機通信時的“三路握手”。下面詳細說明這兩個過程(假設(shè)兩臺通信的計算機為客戶端-服務(wù)器模型,調(diào)用中用到的參數(shù),請自行查看相關(guān)API):

(1)兩個Socket的初始化。

服務(wù)器端

首先,用C語言通過系統(tǒng)調(diào)用socket()函數(shù)來創(chuàng)建套接口。通過以下程序段便可以建立一個用TCP的Socket:

int listensockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)

其次,通過系統(tǒng)調(diào)用int bind ()函數(shù)來初始化Socket中的本地IP地址和本地端口號。通過以下語句,便可以初始化服務(wù)器端的Socket:

bind( listensockfd, (struct sockaddr*) &saServer, sizeof (saServer));

最后,我們通過系統(tǒng)調(diào)用listen()函數(shù)來將已經(jīng)綁定了本機IP地址和程序端口號的Socket的狀態(tài)由主動(positive)轉(zhuǎn)換為被動(passive)(只有處于被動的Socket才會接受對方的信息)。并調(diào)用accept()函數(shù)來獲取已經(jīng)準備好的套接字準備收取數(shù)據(jù)。通過以下程序段,便可以啟動監(jiān)聽Socket,并返回Q1隊列中和客戶端“三路握手”完成的套接字,如圖1所示。

listen( listensockfd, 5 );

int acceptSocket = accept(listenSocketfd, NULL, NULL );

客戶端

通過Socket系統(tǒng)調(diào)用建立Socket,然后初始化客戶端的IP地址和端口號,并通過connect()函數(shù)將初始化好的IP地址和端口號的數(shù)據(jù)結(jié)構(gòu)綁定在新建的Socket上,與服務(wù)器端不同的是這個數(shù)據(jù)結(jié)構(gòu)是為了初始化客戶端的IP地址和進程端口,如圖1所示。

圖1

(2)兩臺計算機通信時的“三路握手”

第一次握手:客戶端調(diào)用connect()函數(shù)將目的地(服務(wù)器端)的IP地址和進程端口初始化的同時,給內(nèi)核運輸層發(fā)出指令,使其將封裝好(其中包含完整的四元組)的數(shù)據(jù)包(同步包,下面簡稱SYN包),通過更底層的協(xié)議層向目的地(服務(wù)器端)傳送,以發(fā)出請求。

第二次握手:當(dāng)目的地(服務(wù)器端)收到客戶端發(fā)送的SYN包時,如果請求可以通過,服務(wù)器端也通過運輸層封裝好一個包含通過請求的SYN+ACK包,否則封裝一個拒絕請求的SYN+NACK包發(fā)送給客戶端,于此同時,服務(wù)器內(nèi)核自動創(chuàng)建一個Socket,并將已將創(chuàng)建好的監(jiān)聽套接口的本地IP地址和進程端口拷貝到新創(chuàng)建的Socket中的本地IP地址和進程端口中,將第一次握手過程中的SYN包中的客戶端的IP地址和端口號拷貝在新創(chuàng)建的Socket中的目的地IP地址和端口號中,然后將新創(chuàng)建的Socket放入監(jiān)聽Socket中的Q0隊列(用于放置內(nèi)核為服務(wù)器和不同客戶端通信創(chuàng)建的未完成“三路握手”Socket)中。

第三次握手:當(dāng)客戶端收到服務(wù)器端回應(yīng)的SYN+ACK包時,客戶端需要再返回給服務(wù)器一個SYN包表示已經(jīng)收到SYN+ACK包,與此同時,服務(wù)器將剛才放入Q0隊列的Socket放入監(jiān)聽套接口的Q1隊列中(用于放置內(nèi)核為服務(wù)器和不同客戶端通信創(chuàng)建的已經(jīng)完成“三路握手”Socket),而客戶端通過系統(tǒng)調(diào)用accept()正是獲取的Q1隊列中的套接字。如圖2所示。

3 通過socke進行通信

服務(wù)器端通過系統(tǒng)調(diào)用recv()進行數(shù)據(jù)的獲取,客戶端可以通過調(diào)用send()進行數(shù)據(jù)的發(fā)送。

以下便是整個Socket通信的流程圖,如圖2所示。

圖2

[1] Jesse Storimer. TCP Sockets編 程[M].北京:人民郵電出版社,2013.

TP311

A

猜你喜歡
端口號服務(wù)器端IP地址
Linux環(huán)境下基于Socket的數(shù)據(jù)傳輸軟件設(shè)計
鐵路遠動系統(tǒng)幾種組網(wǎng)方式IP地址的申請和設(shè)置
在Docker容器中安裝應(yīng)用程序
淺析異步通信層的架構(gòu)在ASP.NET 程序中的應(yīng)用
IP地址切換器(IPCFG)
基于SNMP的IP地址管理系統(tǒng)開發(fā)與應(yīng)用
淺談以java為基礎(chǔ)的Socket通信簡介及實現(xiàn)
基于Qt的安全即時通訊軟件服務(wù)器端設(shè)計
公安網(wǎng)絡(luò)中IP地址智能管理的研究與思考
Winsock編程在《計算機網(wǎng)絡(luò)基礎(chǔ)》教學(xué)中的應(yīng)用