版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、網(wǎng)絡(luò)編程學(xué)習(xí)小結(jié)幾種網(wǎng)絡(luò)編程方式:ISAPI、CGI、WinInet、Winsock它們之間的區(qū)別:1) ISAPI主要是開發(fā)基于瀏覽器客戶端與服務(wù)器端程序。效率比CGI方式高,而且也擴展了CGI沒有的一些功能。(基于TCP/IP模型中的應(yīng)用層)2) CGI主要是開發(fā)基于瀏覽器客戶端與服務(wù)器端程序。(基于TCP/IP模型中的應(yīng)用層)3) WinInet主要是開發(fā)客戶端程序。(基于TCP/IP模型中的應(yīng)用層)4) Winsock主要是基于socket來開發(fā)客戶端與服務(wù)器端程序。(基于TCP/IP模型中的各層)要想開發(fā)低層協(xié)議的程序的話就要了解協(xié)議的報文格式。 網(wǎng)絡(luò)基礎(chǔ)知識:網(wǎng)絡(luò)硬件 數(shù)據(jù)通訊原理
2、 (詳見/source/1196517)OSI七層網(wǎng)絡(luò)模型與TCP/IP四層網(wǎng)絡(luò)模型 (詳見/topic/thread-396621.html)網(wǎng)絡(luò)原理和協(xié)議 (詳見/)Winsock 網(wǎng)絡(luò)編程:建議,把機械工業(yè)出版社出的Windows網(wǎng)絡(luò)編程技術(shù)看N遍后,再利用MFC或者SDK編寫一些小的通信例程,然后編寫較大規(guī)模的網(wǎng)絡(luò)程序,最后你就明白了網(wǎng)絡(luò)編程了! Windows網(wǎng)絡(luò)編程技術(shù)專門討論Windows網(wǎng)絡(luò)編程技術(shù),覆蓋Windows 95/98/NT 4/2000/CE平臺。內(nèi)容包括NetBIOS和Windows重定向器方法、Winsock方法、客戶端遠程訪問服務(wù)器方法。本書論述深入淺出、用
3、大量實例詳解了微軟網(wǎng)絡(luò)API函數(shù)的應(yīng)用。TCP/IP詳解,卷1:協(xié)議是一本完整而詳細的TCP/IP協(xié)議指南。描述了屬于每一層的各個協(xié)議以及它們?nèi)绾卧诓煌僮飨到y(tǒng)中運行。網(wǎng)絡(luò)通信編程實用案例精選是一本介紹利用vlsuaIC+進行網(wǎng)絡(luò)通信程序開發(fā)的書籍。書中精選了大量網(wǎng)絡(luò)實例,涵蓋了本地汁算機網(wǎng)絡(luò)編程、局域網(wǎng)網(wǎng)絡(luò)通信編程、IE編程、網(wǎng)絡(luò)通信協(xié)議編程、串口通信編程、代理服務(wù)器編程和高級網(wǎng)絡(luò)通信編程ACE:ACE自適配通信環(huán)境(ADAPTIVE Communication E/ace_tao/index.html建議在、/網(wǎng)站上找些老外寫的網(wǎng)絡(luò)代碼研究研究,最好能參加實際的網(wǎng)絡(luò)項目,這樣能見識更多成熟
4、的網(wǎng)絡(luò)類庫。最好能參加實際的網(wǎng)絡(luò)項目,這樣能見識更多成熟的網(wǎng)絡(luò)類庫。 開源網(wǎng)絡(luò)封裝庫 :ACE,ICE,asio,cppsocket,netclass,poco,SimpleSocket,socketman,Sockets 開源下載工具 fdm, eMulePlus,eMule 開源FTP FileZilla 開源服務(wù)器 Apache 網(wǎng)游服務(wù)器開源框架 GNE,HawkNL,RakNet,SDL_net 網(wǎng)絡(luò)協(xié)議分析軟件:Sniffer工具WPE -抓包Ethereal -協(xié)議分析 SockMon5 -抓包及錯誤分析 Windows網(wǎng)絡(luò)編程細節(jié)問題: 1. 如果在已經(jīng)處于 ESTABLISH
5、ED狀態(tài)下的socket(一般由端口號和標志符區(qū)分)調(diào)用closesocket(一般不會立即關(guān)閉而經(jīng)歷TIME_WAIT的過程)后想繼續(xù)重用該socket: BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL); 2. 如果要已經(jīng)處于連接狀態(tài)的soket在調(diào)用closesocket后強制關(guān)閉,不經(jīng)歷TIME_WAIT的過程: BOOL bDontLinger = FALSE; setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(c
6、onst char*)&bDontLinger,sizeof(BOOL); 3.在send(),recv()過程中有時由于網(wǎng)絡(luò)狀況等原因,發(fā)收不能預(yù)期進行,而設(shè)置收發(fā)時限:int nNetTimeout=1000;/1秒/發(fā)送時限setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int);/接收時限setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int); 4.在send()的時候,返回的是實際發(fā)送出去的字節(jié)(同步)或
7、發(fā)送到socket緩沖區(qū)的字節(jié)(異步);系統(tǒng)默認的狀態(tài)發(fā)送和接收一次為8688字節(jié)(約為8.5K);在實際的過程中發(fā)送數(shù)據(jù)和接收數(shù)據(jù)量比較大,可以設(shè)置socket緩沖區(qū),而避免了send(),recv()不斷的循環(huán)收發(fā):/ 接收緩沖區(qū)int nRecvBuf=32*1024;/設(shè)置為32Ksetsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int);/發(fā)送緩沖區(qū)int nSendBuf=32*1024;/設(shè)置為32Ksetsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSen
8、dBuf,sizeof(int);5. 如果在發(fā)送數(shù)據(jù)的時,希望不經(jīng)歷由系統(tǒng)緩沖區(qū)到socket緩沖區(qū)的拷貝而影響程序的性能:int nZero=0;setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero);6.同上在recv()完成上述功能(默認情況是將socket緩沖區(qū)的內(nèi)容拷貝到系統(tǒng)緩沖區(qū)):int nZero=0;setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int);7.一般在發(fā)送UDP數(shù)據(jù)報的時候,希望該socket發(fā)送的數(shù)據(jù)具有
9、廣播特性:BOOL bBroadcast=TRUE;setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL);8.在client連接服務(wù)器過程中,如果處于非阻塞模式下的socket在connect()的過程中可以設(shè)置connect()延時,直到accpet()被呼叫(本函數(shù)設(shè)置只有在非阻塞的過程中有顯著的作用,在阻塞的函數(shù)調(diào)用中作用不大)BOOL bConditionalAccept=TRUE;setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const ch
10、ar*)&bConditionalAccept,sizeof(BOOL);9.如果在發(fā)送數(shù)據(jù)的過程中(send()沒有完成,還有數(shù)據(jù)沒發(fā)送)而調(diào)用了closesocket(),以前我們一般采取的措施是從容關(guān)閉shutdown(s,SD_BOTH),但是數(shù)據(jù)是肯定丟失了,如何設(shè)置讓程序滿足具體應(yīng)用的要求(即讓沒發(fā)完的數(shù)據(jù)發(fā)送出去后在關(guān)閉socket)?struct linger u_short l_onoff;u_short l_linger;linger m_sLinger;m_sLinger.l_onoff=1;/(在closesocket()調(diào)用,但是還有數(shù)據(jù)沒發(fā)送完畢的時候容許逗留)/
11、如果m_sLinger.l_onoff=0;則功能和B)作用相同;m_sLinger.l_linger=5;/(容許逗留的時間為5秒)setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger);注意點: A.在設(shè)置了逗留延時,用于一個非阻塞的socket是作用不大的,最好不用;B.如果想要程序不經(jīng)歷SO_LINGER需要設(shè)置SO_DONTLINGER,或者設(shè)置l_onoff=0;10.一個用的比較少的是在SDI或者是Dialog的程序中,可以記錄socket的調(diào)試信息:BOOL bDebug=TRUE;set
12、sockopt(s,SOL_SOCKET,SO_DEBUG,(const char*)&bDebug,sizeof(BOOL);11.往往通過setsockopt()設(shè)置了緩沖區(qū)大小,但還不能滿足數(shù)據(jù)的傳輸需求,一般習(xí)慣是自己寫個處理網(wǎng)絡(luò)緩沖的類,動態(tài)分配內(nèi)存。 12、#include ,#include沖突問題解決方法:在StdAfx.h 頭文件中添加winsock2.h,Afxsock.h先#include 再#include 13、獲取數(shù)據(jù)包,一般來說想獲取數(shù)據(jù)包可以使用IP_HDRINCL選項,但是在Windows 2000/XP中setsockopt()中IP_HDRINCL是個不合
13、法的選項,但是可以使用 WSAIoctl() 函數(shù)調(diào)用SIO_RCVALL捕獲IP數(shù)據(jù)包。簡單步驟如下:1)、Create a raw socket. 2)、Bind the socket to the local IP over which the traffic is to be sniffed. 3)、WSAIoctl() the socket with SIO_RCVALL to give it sniffing powers. 4)、Put the socket in an infinite loop of recvfrom. 5)、n joy! the Buffer from re
14、cvfrom. 14、IP、TCP、UDP、ICMP數(shù)據(jù)包格式/*The IP header */typedef struct tagIPHEADER unsigned char version:4; unsigned char header_len:4; unsigned char tos; unsigned short total_len; unsigned short ident; unsigned short flags; unsigned char ttl; unsigned char proto; unsigned short checksum; unsigned int sour
15、ceIP; unsigned int destIP;IPHEADER;struct TCPPacketHead WORD SourPort; WORD DestPort; DWORD SeqNo; DWORD AckNo; BYTE HLen; BYTE Flag; WORD WndSize; WORD ChkSum; WORD UrgPtr;struct ICMPPacketHead BYTE Type; BYTE Code; WORD ChkSum;struct UDPPacketHead WORD SourPort; WORD DestPort; WORD Len; WORD ChkSu
16、m; 15、幾種winsock I/O模型比較:select模型核心就是select函數(shù),它可用于判斷套接字上是否存在數(shù)據(jù),或者能否向一個套接字寫入數(shù)據(jù)。這個函數(shù)可以有效地防止應(yīng)用程序在套接字處于阻塞模式中時,send或recv進入阻塞狀態(tài);同時也可以防止產(chǎn)生大量的WSAEWOULDBLOCK錯誤select的優(yōu)勢是能夠從單個線程的多個套接字上進行多重連接及I/O。WSAAsyncSelect 模型是以消息機制為基礎(chǔ),能夠處理一定的客戶連接量,但是擴展性也不是很好。因為消息泵很快就會阻塞,降低了消息處理的速度。WSAAsyncSelect和WSAEventSelect模型提供了讀寫數(shù)據(jù)能力的異
17、步通知,但他們不提供異步數(shù)據(jù)傳送,而重疊及完成端口提供異步數(shù)據(jù)的傳送。WSAEventSelect 模型以時間為基礎(chǔ)的網(wǎng)絡(luò)事件通知,但是與WSAAsyncSelect不同的是,它主要是由事件對象句柄完成的,而不是通過窗口。但是一個線程只能等待64個事件(需要開辟多個線程解決),伸縮性不如完成端口。重疊模型可以使程序能達到更佳的系統(tǒng)性能?;驹O(shè)計原理就是讓應(yīng)用程序使用重疊的數(shù)據(jù)結(jié)構(gòu),一次投遞一個或多個I/O請求。針對這些提交的請求,在他們完成之后,應(yīng)用程序可為他們提供服務(wù)。它又分為兩種實現(xiàn)方法:事件通知和完成例程。重疊I/O模型事件通知依賴于等待事件通知的線程數(shù)(WSAWaitForMultip
18、leEvents調(diào)用的每個線程,該I/O模型一次最多都只能支持6 4個套接字。),處理客戶通信時,大量線程上下文的切換是它們共同的制約因素。完成端口提供了最好的伸縮性,往往可以使系統(tǒng)達到最好的性能,是處理成千上萬的套接字的首選。從本質(zhì)上說,完成端口模型要求創(chuàng)建一個windows完成端口對象,該對象通過指定數(shù)量的線程,對重疊I/O請求進行管理,以便為已經(jīng)完成的重疊I/O請求提供服務(wù)。但是完成端口只是支持NT系統(tǒng)、WIN2000系統(tǒng)。重疊模型和完成端口模型的應(yīng)用程序通知緩沖區(qū)收發(fā)系統(tǒng)直接使用數(shù)據(jù),也就是說,如果應(yīng)用程序投遞了一個10KB大小的緩沖區(qū)來接收數(shù)據(jù),且數(shù)據(jù)已經(jīng)到達套接字,則該數(shù)據(jù)將直接被
19、拷貝到投遞的緩沖區(qū)。 而select模型、WSAAsyncSelect 模型、WSAEventSelect 模型,數(shù)據(jù)到達并拷貝到單套接字接收緩沖區(qū)中,此時應(yīng)用程序會被告知可以讀入的容量。當應(yīng)用程序調(diào)用接收函數(shù)之后,數(shù)據(jù)才從單套接字緩沖區(qū)拷貝到應(yīng)用程序的緩沖區(qū),差別就體現(xiàn)出來了。 16、服務(wù)器與客戶端IO模型選擇對于如何挑選最適合自己應(yīng)用程序的I/O模型已經(jīng)很明晰了。同開發(fā)一個簡單的運行多線程的鎖定模式應(yīng)用相比,其他每種I/O模型都需要更為復(fù)雜的編程工作。因此,針對客戶機和服務(wù)器應(yīng)用開發(fā)模型的選擇,有以下原則。1). 客戶端若打算開發(fā)一個客戶機應(yīng)用,令其同時管理一個或多個套接字,那么建議采用重
20、疊I/O或WSAEventSelect模型,以便在一定程度上提升性能。然而,假如開發(fā)的是一個以Windows為基礎(chǔ)的應(yīng)用程序,要進行窗口消息的管理,那么WSAAsyncSelect模型恐怕是一種最好的選擇,因為WSAAsyncSelect本身便是從Windows消息模型借鑒來的。采用這種模型,程序需具備消息處理功能。2). 服務(wù)器端若開發(fā)的是一個服務(wù)器應(yīng)用,要在一個給定的時間,同時控制多個套接字,建議采用重疊I/O模型,這同樣是從性能角度考慮的。但是,如果服務(wù)器在任何給定的時間,都會為大量I/O請求提供服務(wù),便應(yīng)考慮使用I/O完成端口模型,從而獲得更佳的性能。 17、shutdown、clos
21、esocket區(qū)別shutdown 從容關(guān)閉,為了保證通信雙方都能夠收到應(yīng)用程序發(fā)出的所有數(shù)據(jù),一個合格的應(yīng)用程序的做法是通知接受雙發(fā)都不在發(fā)送數(shù)據(jù)!這就是所謂的“正常關(guān)閉”套接字的方法,而這個方法就是由shutdown函數(shù),傳遞給它的參數(shù)有SD_RECEIVE,SD_SEND,SD_BOTH三種,如果是SD_RECEIVE就表示不允許再對此套接字調(diào)用接受函數(shù)。這對于協(xié)議層沒有影響,另外對于tcp套接字來說,無論數(shù)據(jù)是在等候接受還是即將抵達,都要重置連接(注意對于udp協(xié)議來說,仍然接受并排列傳入的數(shù)據(jù),因此udp套接字而言shutdown毫無意義)。如果選擇SE_SEND,則表示不允許再調(diào)用
22、發(fā)送函數(shù)。對于tcp套接字來說,這意味著會在所有數(shù)據(jù)發(fā)送出并得到接受端確認后產(chǎn)生一個FIN包。如果指定SD_BOTH,答案不言而喻。 closesocket 正式關(guān)閉,關(guān)閉連接,釋放所有相關(guān)的資源。因為無連接協(xié)議沒有連接,所以不會有正式關(guān)閉和從容關(guān)閉,直接調(diào)用closesocket函數(shù)。 18、TCP鏈接三次握手、終止鏈接四次握手 19、getpeername 、getsocknamegetpeername 函數(shù)用于獲得通信方的套接字地址信息,該信息上關(guān)于已建立連接的那個套接字的。getsockname 函數(shù)是getpeername的對應(yīng)函數(shù)。它返回的是指定套接字的本地接口的地址信息。 20、
23、MFC下CSocket編程注意事項1)、在使用MFC編寫socket程序時,必須要包含都文件。2)、AfxSocketInit() 這個函數(shù),在使用CSocket前一定要先調(diào)用該函數(shù),否則使用CSocket會出錯。3)、CSocket:Create 的接口就是, 實現(xiàn)上還執(zhí)行了 CSocket:Bind , 非常不容易被發(fā)現(xiàn)。如果是以 Create 方法初始化的前提下不能再調(diào)用 Bind ,要不一定出錯。一般寫服務(wù)器程序都不要用Create 為好,用下面的 CSocket:Socket 初始化然后Bind。 21、winsock 有兩個不同的版本winsock 有兩個不同的版本,第一版很old
24、了,win95時代的,win2000后推崇第二版winsock 2, 出了主板本號外,還有子版本號,這些功能上有差別,winsock2 支持原始套接字編程, MFC 還封裝了winsock,使用WINSOCK.h 要用到WSOCK32.LIB, 還有一些擴展api功能,需要MSWSOCK.h MSWSOCK.DLL 。 現(xiàn)在winsock.h winsock2.h 都用ws2_32.lib。 22、sockaddr_in , sockaddr , in_addr區(qū)別struct sockaddr unsigned short sa_family; char sa_data14; ; 上面是通用
25、的socket地址,具體到Internet socket,用下面的結(jié)構(gòu),二者可以進行類型轉(zhuǎn)換 struct sockaddr_in short int sin_family; unsigned short int sin_port; struct in_addr sin_addr; unsigned char sin_zero8; ; struct in_addr就是32位IP地址。 struct in_addr union struct u_char s_b1,s_b2,s_b3,s_b4; S_un_b; struct u_short s_w1,s_w2; S_un_w; u_long S
26、_addr; S_un; #define s_addr S_un.S_addr ; inet_addr()是將一個點分制的IP地址(如)轉(zhuǎn)換為上述結(jié)構(gòu)中需要的32位IP地址(0 xC0A80001)。填值的時候使用sockaddr_in結(jié)構(gòu),而作為函數(shù)(如socket, listen, bind等)的參數(shù)傳入的時候轉(zhuǎn)換成sockaddr結(jié)構(gòu)就行了,畢竟都是16個字符長。通常的用法是: int sockfd; struct sockaddr_in my_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); my_addr.sin_addr.s_a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年浙科版七年級歷史下冊階段測試試卷
- 2025年湘師大新版九年級地理上冊月考試卷含答案
- 年產(chǎn)1000萬把扳手技改項目可行性研究報告寫作模板-申批備案
- 2025年冀教版九年級歷史下冊階段測試試卷
- 2025年統(tǒng)編版九年級地理下冊階段測試試卷含答案
- 二零二五年度農(nóng)家樂生態(tài)農(nóng)業(yè)科技示范園合作開發(fā)合同范本4篇
- 二零二五版美甲店顧客滿意度調(diào)查與分析合同模板3篇
- 二零二五寧波教育培訓(xùn)機構(gòu)教師勞動合同4篇
- 2025年度水上交通船舶駕駛員派遣合同范本4篇
- 二零二五年度住宅小區(qū)智能化改造合同4篇
- 《向心力》 教學(xué)課件
- 結(jié)構(gòu)力學(xué)數(shù)值方法:邊界元法(BEM):邊界元法的基本原理與步驟
- 2024年山東省泰安市高考語文一模試卷
- 工程建設(shè)行業(yè)標準內(nèi)置保溫現(xiàn)澆混凝土復(fù)合剪力墻技術(shù)規(guī)程
- 北師大版物理九年級全一冊課件
- 2024年第三師圖木舒克市市場監(jiān)督管理局招錄2人《行政職業(yè)能力測驗》高頻考點、難點(含詳細答案)
- RFJ 006-2021 RFP型人防過濾吸收器制造與驗收規(guī)范(暫行)
- 盆腔炎教學(xué)查房課件
- 新概念英語課件NCE3-lesson15(共34張)
- GB/T 3683-2023橡膠軟管及軟管組合件油基或水基流體適用的鋼絲編織增強液壓型規(guī)范
- 電視劇《瑯琊榜》特色分析
評論
0/150
提交評論