




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1Socket通信2Socket通信(一)Socket相關(guān)理論(二)TCP的工作流程(三)Socket相關(guān)代碼3(一)Socket相關(guān)理論 提到網(wǎng)絡(luò)編程就必須說(shuō)Socket。因?qū)懢W(wǎng)絡(luò)程序就必須要用Socket。 對(duì)于網(wǎng)絡(luò)編程,我們也言必稱(chēng)TCP/IP,似乎其它網(wǎng)絡(luò)協(xié)議已經(jīng)不存在了。對(duì)于TCP/IP,我們還知道TCP和UDP,TCP面向連接,UDP面向無(wú)連接,前者可以保證數(shù)據(jù)的正確和可靠性,后者則允許數(shù)據(jù)丟失。 最后,我們還知道,在建立連接前,必須知道對(duì)方的IP地址和端口號(hào)。4(一)Socket相關(guān)理論我們還知道如下幾個(gè)事實(shí):1。一個(gè)指定的端口號(hào)不能被多個(gè)程序共用。 比如,如果鼠標(biāo)占用了80端口
2、,那么U盤(pán)就不能用80端口了。2。很多防火墻只允許特定目標(biāo)端口的數(shù)據(jù)包通過(guò)。3。服務(wù)程序在listen某個(gè)端口并accept某個(gè)連接請(qǐng)求后,會(huì)生成一個(gè)新的socket來(lái)對(duì)該請(qǐng)求進(jìn)行處理。5(一)Socket相關(guān)理論 如果一個(gè)socket創(chuàng)建后并與80端口綁定后,是否就意味著該socket占用了80端口呢?如果是這樣的,那么當(dāng)其accept一個(gè)請(qǐng)求后,生成的新的socket到底使用的是什么端口呢?如果是系統(tǒng)會(huì)默認(rèn)給其分配一個(gè)空閑的端口號(hào),那一定不是80端口了,于是以后的TCP數(shù)據(jù)包的目標(biāo)端口就不是80了-防火墻一定會(huì)阻止其通過(guò)的!6(一)Socket相關(guān)理論 實(shí)際上,我們可以看到,防火墻并沒(méi)有阻
3、止這樣的連接,而且這是最常見(jiàn)的連接請(qǐng)求和處理方式。為什么防火墻沒(méi)有阻止這樣的連接?它是如何判定那條連接是因?yàn)閏onnet80端口而生成的?是不是TCP數(shù)據(jù)包里有什么特別的標(biāo)志?或者防火墻記住了什么東西?7(一)Socket相關(guān)理論類(lèi)型流式套接字(SOCK_STREAM)-TCP提供了一個(gè)面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無(wú)差錯(cuò)、無(wú)重復(fù)的發(fā)送且按發(fā)送順序接收。內(nèi)設(shè)置流量控制,避免數(shù)據(jù)流淹沒(méi)慢的接收方。數(shù)據(jù)被看作是字節(jié)流,無(wú)長(zhǎng)度限制。數(shù)據(jù)報(bào)套接字(SOCK_DGRAM)-UDP提供無(wú)連接服務(wù)。數(shù)據(jù)包以獨(dú)立數(shù)據(jù)包的形式被發(fā)送,不提供無(wú)差錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù),順序發(fā)送,可能亂序接收。8 Sock
4、et 的 位置傳輸層傳輸層傳輸層網(wǎng)絡(luò)層網(wǎng)絡(luò)層9(一)Socket相關(guān)理論在TCP和UDP同屬于傳輸層,共同架設(shè)在IP層(網(wǎng)絡(luò)層)之上。而IP層主要負(fù)責(zé)的是在節(jié)點(diǎn)之間(End to End)的數(shù)據(jù)包傳送,這里的節(jié)點(diǎn)是一臺(tái)網(wǎng)絡(luò)設(shè)備,比如計(jì)算機(jī)。因?yàn)镮P層只負(fù)責(zé)把數(shù)據(jù)送到節(jié)點(diǎn),而不能區(qū)分上面的不同應(yīng)用,所以TCP和UDP協(xié)議在其基礎(chǔ)上加入了端口的信息,端口于是標(biāo)識(shí)的是一個(gè)節(jié)點(diǎn)上的一個(gè)應(yīng)用。除了增加端口信息,UPD協(xié)議基本就沒(méi)有對(duì)IP層的數(shù)據(jù)進(jìn)行任何的處理了。而TCP協(xié)議還加入了更加復(fù)雜的傳輸控制,比如滑動(dòng)的數(shù)據(jù)發(fā)送窗口(Slice Window),以及接收確認(rèn)和重發(fā)機(jī)制,以達(dá)到數(shù)據(jù)的可靠傳送。不管應(yīng)
5、用層看到的是怎樣一個(gè)穩(wěn)定的TCP數(shù)據(jù)流,下面?zhèn)魉偷亩际且粋€(gè)個(gè)的IP數(shù)據(jù)包,需要由TCP協(xié)議來(lái)進(jìn)行數(shù)據(jù)重組。所謂的端口,是為了區(qū)分不同的應(yīng)用的,以在不同的IP包來(lái)到的時(shí)候能夠正確轉(zhuǎn)發(fā)。10(一)Socket相關(guān)理論 可得出信息: 防火墻除了獲取IP地址和端口號(hào)之外,并沒(méi)有足夠的信息判斷TCP數(shù)據(jù)包的更多信息。 所謂的端口,是為了區(qū)分不同的應(yīng)用的,以在不同的IP包來(lái)到的時(shí)候能夠正確轉(zhuǎn)發(fā)。11 TCP/IP只是一個(gè)協(xié)議棧,就像操作系統(tǒng)的運(yùn)行機(jī)制一樣,必須要具體實(shí)現(xiàn),同時(shí)還要提供對(duì)外的操作接口,就像操作系統(tǒng)會(huì)提供標(biāo)準(zhǔn)的編程接口。 TCP/IP引入了新型的“I/O”操作-Socket編程接口 socke
6、t的出現(xiàn)只是可以更方便的使用TCP/IP協(xié)議棧而已,其對(duì)TCP/IP進(jìn)行了抽象,形成了幾個(gè)最基本的函數(shù)接口。比如create,listen,accept,connect,read和write等等。(一)Socket相關(guān)理論12如果一個(gè)程序創(chuàng)建了一個(gè)socket,并讓其監(jiān)聽(tīng)80端口,其實(shí)是向TCP/IP協(xié)議棧聲明了其對(duì)80端口的占有。以后,所有目標(biāo)是80端口的TCP數(shù)據(jù)包都會(huì)轉(zhuǎn)發(fā)給該程序(這里的程序,因?yàn)槭褂玫氖荢ocket編程接口,所以首先由Socket層來(lái)處理)。accept函數(shù)返回的新socket其實(shí)指代的是本次創(chuàng)建的連接,而一個(gè)連接是包括兩部分信息的,一個(gè)是源IP和源端口,另一個(gè)是宿IP
7、和宿端口。(所謂accept函數(shù),其實(shí)抽象的是TCP的連接建立過(guò)程。)(一)Socket相關(guān)理論13所以,accept可以產(chǎn)生多個(gè)不同的socket,而這些socket里包含的宿IP和宿端口是不變的,變化的只是源IP和源端口。這樣的話(huà),這些socket宿端口就可以都是80,而Socket層還是能根據(jù)源/宿對(duì)來(lái)準(zhǔn)確地分辨出IP包和socket的歸屬關(guān)系,從而完成對(duì)TCP/IP協(xié)議的操作封裝!而同時(shí),放火墻的對(duì)IP包的處理規(guī)則也是清晰明了,不存在前面設(shè)想的種種復(fù)雜的情形。 (一)Socket相關(guān)理論14(二)TCP的工作流程2.1 服務(wù)器端工作流程使用WSAStartup()函數(shù)檢查系統(tǒng)協(xié)議棧安裝
8、情況使用socket()函數(shù)創(chuàng)建服務(wù)器端通信套接口使用bind()函數(shù)將創(chuàng)建的套接口與服務(wù)器地址綁定使用listen()函數(shù)使服務(wù)器套接口做好接收連接請(qǐng)求準(zhǔn)備使用accept()接收來(lái)自客戶(hù)端由connect()函數(shù)發(fā)出的連接請(qǐng)求根據(jù)連接請(qǐng)求建立連接后,使用send()函數(shù)發(fā)送數(shù)據(jù),或者使用recv()函數(shù)接收數(shù)據(jù)使用closesocket()函數(shù)關(guān)閉套接口(可以先用shutdown()函數(shù)先關(guān)閉讀寫(xiě)通道)最后調(diào)用WSACleanup()函數(shù)結(jié)束Winsock Sockets API15(二)TCP的工作流程2.2 客戶(hù)端程序工作流程使用WSAStartup()函數(shù)檢查系統(tǒng)協(xié)議棧安裝情況使用s
9、ocket()函數(shù)創(chuàng)建客戶(hù)端套接口使用connect()函數(shù)發(fā)出也服務(wù)器建立連接的請(qǐng)求(調(diào)用前可以不用bind()端口號(hào),由系統(tǒng)自動(dòng)完成)連接建立后使用send()函數(shù)發(fā)送數(shù)據(jù),或使用recv()函數(shù)接收數(shù)據(jù)使用closesocet()函數(shù)關(guān)閉套接口最后調(diào)用WSACleanup()函數(shù),結(jié)束Winsock Sockets API162.3 服務(wù)器與客戶(hù)端五元組的建立172.4 TCP的程序工作流程圖18客戶(hù)端的建立 相比于服務(wù)器,客戶(hù)端就簡(jiǎn)單多了,因?yàn)樗恍枰粋€(gè)SOCKET。 添加一個(gè)基于CSocket的子類(lèi)Client,點(diǎn)擊完成。這個(gè)類(lèi)我們用于和客戶(hù)端的連接和收發(fā)數(shù)據(jù)。 然后,在主對(duì)話(huà)框的
10、頭文件中添加#include MySocket.h,并且聲明一個(gè)Cilent類(lèi) m_mySocket; 接著,我們得再主對(duì)話(huà)框的OnInitDialog函數(shù)中添加m_mySocket.Creat(); /初始化SOCKET 19 這時(shí)候,我們可以為主對(duì)話(huà)框添加一個(gè)按鈕,caption設(shè)為“連接”,用于連接。雙擊這個(gè)按鈕,開(kāi)始函數(shù)定義,在函數(shù)體中我們加入以下代碼:m_mySocket.Connect(_T(127.0.0.1),8888);第一個(gè)參數(shù)表示想要連接的服務(wù)器的IP,第二個(gè)參數(shù)表示端口?,F(xiàn)在,客戶(hù)端與服務(wù)器的連接工作已經(jīng)做好了,我們需要再在客戶(hù)端的主對(duì)話(huà)框中添加一個(gè)按鈕,caption
11、設(shè)為“發(fā)送”,用于發(fā)送信息,在改按鈕的函數(shù)中,我們添加以下代碼:m_mySocket.Send(客戶(hù)端發(fā)來(lái)了信息,100);/參數(shù)分別表示要發(fā)送的字符串和字符串的最大長(zhǎng)度.20服務(wù)端的建立:添加一個(gè)基于CSocket的子類(lèi)Socket,點(diǎn)擊完成。這個(gè)類(lèi)我們用于監(jiān)聽(tīng)。接下來(lái)呢,我們?cè)赟ocket類(lèi)函數(shù)實(shí)現(xiàn)中點(diǎn)屬性-重寫(xiě)-OnAccept。點(diǎn)屬性-重寫(xiě)-OnReceive。在OnReceive函數(shù)中,我們添加以下代碼:char str100;Receive(str,100);CString strtest; strtest=str; AfxMessageBox(strtest); 21在OnAcc
12、ept函數(shù)中,我們添加以下代碼:Socket SocketRev= new Socket ();Accept(SocketRev); 這段代碼的作用是在當(dāng)服務(wù)器監(jiān)聽(tīng)到客戶(hù)端的連接請(qǐng)求時(shí),新建一個(gè)CRecv的成員,并用它來(lái)接受客戶(hù)端的連接請(qǐng)求,也就是用它與客戶(hù)端綁定。 22這段代碼用于接收客戶(hù)端發(fā)送過(guò)來(lái)的字符串,然后以MessageBox的形式顯示出來(lái)。最后,在主對(duì)話(huà)框的頭文件中添加#include Listen.h ,并且聲明一個(gè)CListen變量 m_listen 。然后,在主對(duì)話(huà)框的OnInitDialog函數(shù)中,添加如下代碼:m_listen.Create(8888); /8888表示的
13、是我們要監(jiān)聽(tīng)的端口 m_listen.Listen();23(三)Socket相關(guān)代碼 3.1 Socket基本函數(shù)的介紹3.1.1 創(chuàng)建套接字-Socket應(yīng)用程序在使用套接口通信前,必須要擁有一個(gè)套接口,使用socket()函數(shù)來(lái)給應(yīng)用程序創(chuàng)建一個(gè)套接口。SOCKET socket(int af, /要使用的協(xié)議地址族int type, /描述套接口的類(lèi)型int protocol /該套接口使用的特定協(xié)議);24af參數(shù):說(shuō)明套接字接口要使用的協(xié)議地址族,地址族與協(xié)議族含義相同。如果想建立一個(gè)TCP或UDP,只能用常量。AF_INET參數(shù)表示使用互聯(lián)網(wǎng)協(xié)議(IP)地址。Winsock還支持
14、其他協(xié)議,但一般很少使用。type參數(shù):描述套接口的類(lèi)型,af是AF_INET的時(shí)候只能為SOCK_STREAM、SOCK_DGRAM或SOCK_RAWProtocol參數(shù):說(shuō)明該套接口使用的特定協(xié)議,當(dāng)協(xié)議地址族af和協(xié)議類(lèi)型type確定后,協(xié)議字段可以使用的值是限定的socket()參數(shù)說(shuō)明253.1.2 將創(chuàng)建的套接口與服務(wù)器地址綁定bind()當(dāng)socket()創(chuàng)建了一個(gè)套接口后,需要將該套接口與該主機(jī)上提供服務(wù)的某端口聯(lián)系在一起,bind()函數(shù)用于完成這樣的綁定。int bind(SOCKET s, /標(biāo)識(shí)一個(gè)未綁定的套接口描述字const struct sockaddr FAR
15、* name, /存儲(chǔ)了套接口的地址信息int namelen /地址參數(shù)(name)的長(zhǎng)度);26S參數(shù):標(biāo)識(shí)一個(gè)未綁定的套接口描述字,它是socket()函數(shù)調(diào)用成功時(shí)返回的值name參數(shù):是一個(gè)與指定協(xié)議有關(guān)的地址結(jié)構(gòu)指針,存儲(chǔ)了套接口的地址信息,Winsock中使用sockaddr_in結(jié)構(gòu)指定IP地址和端口信息struct sockaddr_inshort sin_family;u_short sin_port;struct in_addrsin_addr;char sin_zero8; sin_family一般為AF_INET,表示使用IP地址族;sin_port是以網(wǎng)絡(luò)字節(jié)序表示
16、的16位端口號(hào);sin_addr是網(wǎng)絡(luò)字節(jié)序的32位IP地址;sin_zero字段一般不用,用0填充namelen參數(shù):表示地址參數(shù)(name)的長(zhǎng)度 IP地址參數(shù)為INADDR_ANY,則由系統(tǒng)內(nèi)核來(lái)自動(dòng)指定port為0,則由系統(tǒng)自動(dòng)指派一個(gè)10245000之間惟一的端口號(hào)bind()參數(shù)說(shuō)明273.1.3 服務(wù)器端啟動(dòng)監(jiān)聽(tīng)listen()函數(shù)在一個(gè)服務(wù)器端用socket()調(diào)用成功創(chuàng)建了一個(gè)套接口,并用bind()函數(shù)和一個(gè)指定的地址關(guān)聯(lián)后,就需要指示該套接口進(jìn)入監(jiān)聽(tīng)連接請(qǐng)求狀態(tài),這需要通過(guò)listen()函數(shù)來(lái)實(shí)現(xiàn) int listen( SOCKET s, int backlog);S
17、參數(shù):代表一個(gè)已綁定了地址,但還未建立連接的套接口描述字Backlog參數(shù):指定了正在等待連接的最大隊(duì)列長(zhǎng)度283.1.4 服務(wù)器端接受連接accept()函數(shù)在服務(wù)器端通過(guò)listen()函數(shù)調(diào)用表示服務(wù)器進(jìn)入監(jiān)聽(tīng)客戶(hù)的連接請(qǐng)求狀態(tài),而在服務(wù)器端調(diào)用accept()函數(shù)時(shí)表示可以接收來(lái)自客戶(hù)端由connect()發(fā)出的連接請(qǐng)求,雙方進(jìn)入連接狀態(tài)。SOCKET accept(SOCKET s, / s標(biāo)識(shí)一個(gè)套接字struct sockaddr FAR * addr, /用來(lái)存放發(fā)出連接請(qǐng)求的那個(gè)客戶(hù)機(jī)的IP地址信息int FAR * addrlen /指出客戶(hù)套接口地址結(jié)構(gòu)的長(zhǎng)度);29s參
18、數(shù):標(biāo)識(shí)一個(gè)套接字,該套接口處于監(jiān)聽(tīng)狀態(tài)addr參數(shù):是一個(gè)地址結(jié)構(gòu)的指針,用來(lái)存放發(fā)出連接請(qǐng)求的那個(gè)客戶(hù)機(jī)的IP地址信息addrlen參數(shù):指出客戶(hù)套接口地址結(jié)構(gòu)的長(zhǎng)度函數(shù)說(shuō)明:該函數(shù)用于面向連接的服務(wù)器端,在IP協(xié)議族中,只用于TCP服務(wù)器端accept()函數(shù)參數(shù)說(shuō)明303.1.5 發(fā)送數(shù)據(jù)-send()函數(shù)在已經(jīng)建立連接的套接口上發(fā)送數(shù)據(jù),可以使用send()函數(shù)int send(SOCKET s, /用于標(biāo)識(shí)已建立連接的套接字const char FAR * buf, /是一個(gè)字符緩沖區(qū),內(nèi)有將要發(fā)送的數(shù)據(jù)int len, /即將發(fā)送的緩沖區(qū)中的字符數(shù) int flags /用于控制
19、數(shù)據(jù)傳輸方式);31s參數(shù):用于標(biāo)識(shí)已建立連接的套接字buf參數(shù):是一個(gè)字符緩沖區(qū),內(nèi)有將要發(fā)送的數(shù)據(jù)len參數(shù):即將發(fā)送的緩沖區(qū)中的字符數(shù)flags參數(shù):用于控制數(shù)據(jù)傳輸方式,0表示按正常方式發(fā)送數(shù)據(jù);宏MSG_DONTROUTE說(shuō)明系統(tǒng)目標(biāo)主機(jī)就在直接連接的本地網(wǎng)絡(luò)中,無(wú)需路由選擇;MSG_OOB指出數(shù)據(jù)是按帶外數(shù)據(jù)發(fā)送的函數(shù)說(shuō)明:send()函數(shù)適用于已建立連接的數(shù)據(jù)報(bào)或流式套接口發(fā)送數(shù)據(jù),對(duì)于數(shù)據(jù)報(bào)類(lèi)型套接口必須注意發(fā)送數(shù)據(jù)長(zhǎng)度不大于通信子網(wǎng)的IP包最大長(zhǎng)度send()函數(shù)參數(shù)說(shuō)明323.1.6 接收數(shù)據(jù)recv()函數(shù)對(duì)于已建立連接的套接口來(lái)說(shuō),要從套接口上接收數(shù)據(jù),就要使用recv()函數(shù)。int recv(SOCKET s, /已建立連接的套接口char FAR * buf, /為用于接收數(shù)據(jù)的緩沖區(qū)int
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)英語(yǔ)課堂流動(dòng)攤販英語(yǔ)口語(yǔ)交際能力培養(yǎng)策略論文
- 高中數(shù)學(xué)建模競(jìng)賽中的數(shù)學(xué)建模問(wèn)題發(fā)現(xiàn)與解決研究論文
- 蕪湖分公司管理制度
- 蘋(píng)果店規(guī)章管理制度
- 蛋白粉與免疫力提升
- 課標(biāo)專(zhuān)用5年高考3年模擬A版2024高考物理專(zhuān)題十一電磁感應(yīng)試題
- 教學(xué)目標(biāo)知識(shí)與能力1培養(yǎng)觀察日常生活中的景物事物的
- 山東省濟(jì)寧市鄒城市第一中學(xué)2024-2025學(xué)年高一下學(xué)期5月月考地理試卷(含答案)
- 江蘇省南通市2024-2025學(xué)年八年級(jí)下學(xué)期數(shù)學(xué)期末考試模擬試卷(含答案)
- 設(shè)計(jì)與共享經(jīng)濟(jì)
- 自然保護(hù)地勘界立標(biāo)技術(shù)指引
- 《論文寫(xiě)作》課件 第1章 論文寫(xiě)作的基本概念
- 2025山東產(chǎn)權(quán)交易中心招聘21人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 廣東省省級(jí)政務(wù)信息化服務(wù)預(yù)算編制標(biāo)準(zhǔn)(運(yùn)維服務(wù)分冊(cè))
- 心肺復(fù)蘇課件2024
- 2025年1月福建省普通高中學(xué)業(yè)水平合格性考試語(yǔ)文仿真模擬卷02(春季高考適用)(考試版)
- PMCAD(V31)用戶(hù)手冊(cè)標(biāo)準(zhǔn)版
- 《粉塵分散度和游離》課件
- 物業(yè)管理會(huì)務(wù)服務(wù)方案
- GB/T 35601-2024綠色產(chǎn)品評(píng)價(jià)人造板和木質(zhì)地板
- 新就業(yè)形態(tài)勞動(dòng)者的風(fēng)險(xiǎn)識(shí)別及治理機(jī)制研究
評(píng)論
0/150
提交評(píng)論