




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、網絡編程學習小結幾種網絡編程方式:ISAPI、CGI、WinInet、Winsock它們之間的區別:1) ISAPI主要是開發基于瀏覽器客戶端與服務器端程序。效率比CGI方式高,而且也擴展了CGI沒有的一些功能。(基于TCP/IP模型中的應用層)2) CGI主要是開發基于瀏覽器客戶端與服務器端程序。(基于TCP/IP模型中的應用層)3) WinInet主要是開發客戶端程序。(基于TCP/IP模型中的應用層)4) Winsock主要是基于socket來開發客戶端與服務器端程序。(基于TCP/IP模型中的各層)要想開發低層協議的程序的話就要了解協議的報文格式。 網絡基礎知識:網絡硬件 數據通訊原理
2、 (詳見/source/1196517)OSI七層網絡模型與TCP/IP四層網絡模型 (詳見/topic/thread-396621.html)網絡原理和協議 (詳見/)Winsock 網絡編程:建議,把機械工業出版社出的Windows網絡編程技術看N遍后,再利用MFC或者SDK編寫一些小的通信例程,然后編寫較大規模的網絡程序,最后你就明白了網絡編程了! Windows網絡編程技術專門討論Windows網絡編程技術,覆蓋Windows 95/98/NT 4/2000/CE平臺。內容包括NetBIOS和Windows重定向器方法、Winsock方法、客戶端遠程訪問服務器方法。本書論述深入淺出、用
3、大量實例詳解了微軟網絡API函數的應用。TCP/IP詳解,卷1:協議是一本完整而詳細的TCP/IP協議指南。描述了屬于每一層的各個協議以及它們如何在不同操作系統中運行。網絡通信編程實用案例精選是一本介紹利用vlsuaIC+進行網絡通信程序開發的書籍。書中精選了大量網絡實例,涵蓋了本地汁算機網絡編程、局域網網絡通信編程、IE編程、網絡通信協議編程、串口通信編程、代理服務器編程和高級網絡通信編程ACE:ACE自適配通信環境(ADAPTIVE Communication E/ace_tao/index.html建議在、/網站上找些老外寫的網絡代碼研究研究,最好能參加實際的網絡項目,這樣能見識更多成熟
4、的網絡類庫。最好能參加實際的網絡項目,這樣能見識更多成熟的網絡類庫。 開源網絡封裝庫 :ACE,ICE,asio,cppsocket,netclass,poco,SimpleSocket,socketman,Sockets 開源下載工具 fdm, eMulePlus,eMule 開源FTP FileZilla 開源服務器 Apache 網游服務器開源框架 GNE,HawkNL,RakNet,SDL_net 網絡協議分析軟件:Sniffer工具WPE -抓包Ethereal -協議分析 SockMon5 -抓包及錯誤分析 Windows網絡編程細節問題: 1. 如果在已經處于 ESTABLISH
5、ED狀態下的socket(一般由端口號和標志符區分)調用closesocket(一般不會立即關閉而經歷TIME_WAIT的過程)后想繼續重用該socket: BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL); 2. 如果要已經處于連接狀態的soket在調用closesocket后強制關閉,不經歷TIME_WAIT的過程: BOOL bDontLinger = FALSE; setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(c
6、onst char*)&bDontLinger,sizeof(BOOL); 3.在send(),recv()過程中有時由于網絡狀況等原因,發收不能預期進行,而設置收發時限:int nNetTimeout=1000;/1秒/發送時限setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int);/接收時限setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int); 4.在send()的時候,返回的是實際發送出去的字節(同步)或
7、發送到socket緩沖區的字節(異步);系統默認的狀態發送和接收一次為8688字節(約為8.5K);在實際的過程中發送數據和接收數據量比較大,可以設置socket緩沖區,而避免了send(),recv()不斷的循環收發:/ 接收緩沖區int nRecvBuf=32*1024;/設置為32Ksetsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int);/發送緩沖區int nSendBuf=32*1024;/設置為32Ksetsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSen
8、dBuf,sizeof(int);5. 如果在發送數據的時,希望不經歷由系統緩沖區到socket緩沖區的拷貝而影響程序的性能:int nZero=0;setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero);6.同上在recv()完成上述功能(默認情況是將socket緩沖區的內容拷貝到系統緩沖區):int nZero=0;setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int);7.一般在發送UDP數據報的時候,希望該socket發送的數據具有
9、廣播特性:BOOL bBroadcast=TRUE;setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL);8.在client連接服務器過程中,如果處于非阻塞模式下的socket在connect()的過程中可以設置connect()延時,直到accpet()被呼叫(本函數設置只有在非阻塞的過程中有顯著的作用,在阻塞的函數調用中作用不大)BOOL bConditionalAccept=TRUE;setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const ch
10、ar*)&bConditionalAccept,sizeof(BOOL);9.如果在發送數據的過程中(send()沒有完成,還有數據沒發送)而調用了closesocket(),以前我們一般采取的措施是從容關閉shutdown(s,SD_BOTH),但是數據是肯定丟失了,如何設置讓程序滿足具體應用的要求(即讓沒發完的數據發送出去后在關閉socket)?struct linger u_short l_onoff;u_short l_linger;linger m_sLinger;m_sLinger.l_onoff=1;/(在closesocket()調用,但是還有數據沒發送完畢的時候容許逗留)/
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.在設置了逗留延時,用于一個非阻塞的socket是作用不大的,最好不用;B.如果想要程序不經歷SO_LINGER需要設置SO_DONTLINGER,或者設置l_onoff=0;10.一個用的比較少的是在SDI或者是Dialog的程序中,可以記錄socket的調試信息:BOOL bDebug=TRUE;set
12、sockopt(s,SOL_SOCKET,SO_DEBUG,(const char*)&bDebug,sizeof(BOOL);11.往往通過setsockopt()設置了緩沖區大小,但還不能滿足數據的傳輸需求,一般習慣是自己寫個處理網絡緩沖的類,動態分配內存。 12、#include ,#include沖突問題解決方法:在StdAfx.h 頭文件中添加winsock2.h,Afxsock.h先#include 再#include 13、獲取數據包,一般來說想獲取數據包可以使用IP_HDRINCL選項,但是在Windows 2000/XP中setsockopt()中IP_HDRINCL是個不合
13、法的選項,但是可以使用 WSAIoctl() 函數調用SIO_RCVALL捕獲IP數據包。簡單步驟如下: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數據包格式/*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函數,它可用于判斷套接字上是否存在數據,或者能否向一個套接字寫入數據。這個函數可以有效地防止應用程序在套接字處于阻塞模式中時,send或recv進入阻塞狀態;同時也可以防止產生大量的WSAEWOULDBLOCK錯誤select的優勢是能夠從單個線程的多個套接字上進行多重連接及I/O。WSAAsyncSelect 模型是以消息機制為基礎,能夠處理一定的客戶連接量,但是擴展性也不是很好。因為消息泵很快就會阻塞,降低了消息處理的速度。WSAAsyncSelect和WSAEventSelect模型提供了讀寫數據能力的異
17、步通知,但他們不提供異步數據傳送,而重疊及完成端口提供異步數據的傳送。WSAEventSelect 模型以時間為基礎的網絡事件通知,但是與WSAAsyncSelect不同的是,它主要是由事件對象句柄完成的,而不是通過窗口。但是一個線程只能等待64個事件(需要開辟多個線程解決),伸縮性不如完成端口。重疊模型可以使程序能達到更佳的系統性能?;驹O計原理就是讓應用程序使用重疊的數據結構,一次投遞一個或多個I/O請求。針對這些提交的請求,在他們完成之后,應用程序可為他們提供服務。它又分為兩種實現方法:事件通知和完成例程。重疊I/O模型事件通知依賴于等待事件通知的線程數(WSAWaitForMultip
18、leEvents調用的每個線程,該I/O模型一次最多都只能支持6 4個套接字。),處理客戶通信時,大量線程上下文的切換是它們共同的制約因素。完成端口提供了最好的伸縮性,往往可以使系統達到最好的性能,是處理成千上萬的套接字的首選。從本質上說,完成端口模型要求創建一個windows完成端口對象,該對象通過指定數量的線程,對重疊I/O請求進行管理,以便為已經完成的重疊I/O請求提供服務。但是完成端口只是支持NT系統、WIN2000系統。重疊模型和完成端口模型的應用程序通知緩沖區收發系統直接使用數據,也就是說,如果應用程序投遞了一個10KB大小的緩沖區來接收數據,且數據已經到達套接字,則該數據將直接被
19、拷貝到投遞的緩沖區。 而select模型、WSAAsyncSelect 模型、WSAEventSelect 模型,數據到達并拷貝到單套接字接收緩沖區中,此時應用程序會被告知可以讀入的容量。當應用程序調用接收函數之后,數據才從單套接字緩沖區拷貝到應用程序的緩沖區,差別就體現出來了。 16、服務器與客戶端IO模型選擇對于如何挑選最適合自己應用程序的I/O模型已經很明晰了。同開發一個簡單的運行多線程的鎖定模式應用相比,其他每種I/O模型都需要更為復雜的編程工作。因此,針對客戶機和服務器應用開發模型的選擇,有以下原則。1). 客戶端若打算開發一個客戶機應用,令其同時管理一個或多個套接字,那么建議采用重
20、疊I/O或WSAEventSelect模型,以便在一定程度上提升性能。然而,假如開發的是一個以Windows為基礎的應用程序,要進行窗口消息的管理,那么WSAAsyncSelect模型恐怕是一種最好的選擇,因為WSAAsyncSelect本身便是從Windows消息模型借鑒來的。采用這種模型,程序需具備消息處理功能。2). 服務器端若開發的是一個服務器應用,要在一個給定的時間,同時控制多個套接字,建議采用重疊I/O模型,這同樣是從性能角度考慮的。但是,如果服務器在任何給定的時間,都會為大量I/O請求提供服務,便應考慮使用I/O完成端口模型,從而獲得更佳的性能。 17、shutdown、clos
21、esocket區別shutdown 從容關閉,為了保證通信雙方都能夠收到應用程序發出的所有數據,一個合格的應用程序的做法是通知接受雙發都不在發送數據!這就是所謂的“正常關閉”套接字的方法,而這個方法就是由shutdown函數,傳遞給它的參數有SD_RECEIVE,SD_SEND,SD_BOTH三種,如果是SD_RECEIVE就表示不允許再對此套接字調用接受函數。這對于協議層沒有影響,另外對于tcp套接字來說,無論數據是在等候接受還是即將抵達,都要重置連接(注意對于udp協議來說,仍然接受并排列傳入的數據,因此udp套接字而言shutdown毫無意義)。如果選擇SE_SEND,則表示不允許再調用
22、發送函數。對于tcp套接字來說,這意味著會在所有數據發送出并得到接受端確認后產生一個FIN包。如果指定SD_BOTH,答案不言而喻。 closesocket 正式關閉,關閉連接,釋放所有相關的資源。因為無連接協議沒有連接,所以不會有正式關閉和從容關閉,直接調用closesocket函數。 18、TCP鏈接三次握手、終止鏈接四次握手 19、getpeername 、getsocknamegetpeername 函數用于獲得通信方的套接字地址信息,該信息上關于已建立連接的那個套接字的。getsockname 函數是getpeername的對應函數。它返回的是指定套接字的本地接口的地址信息。 20、
23、MFC下CSocket編程注意事項1)、在使用MFC編寫socket程序時,必須要包含都文件。2)、AfxSocketInit() 這個函數,在使用CSocket前一定要先調用該函數,否則使用CSocket會出錯。3)、CSocket:Create 的接口就是, 實現上還執行了 CSocket:Bind , 非常不容易被發現。如果是以 Create 方法初始化的前提下不能再調用 Bind ,要不一定出錯。一般寫服務器程序都不要用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 。 現在winsock.h winsock2.h 都用ws2_32.lib。 22、sockaddr_in , sockaddr , in_addr區別struct sockaddr unsigned short sa_family; char sa_data14; ; 上面是通用
25、的socket地址,具體到Internet socket,用下面的結構,二者可以進行類型轉換 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地址(如)轉換為上述結構中需要的32位IP地址(0 xC0A80001)。填值的時候使用sockaddr_in結構,而作為函數(如socket, listen, bind等)的參數傳入的時候轉換成sockaddr結構就行了,畢竟都是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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆江蘇省鎮江市實驗初級中學七下英語期末調研模擬試題含答案
- 四川省南充市四校聯考2025年英語八下期末質量檢測試題含答案
- 教育心理學的實際應用與創新發展
- 中心靜脈置導管的護理講課件
- 江蘇省鹽城市洋馬初級中學2025屆英語八年級第二學期期中教學質量檢測模擬試題含答案
- 歐洲市場推廣出口商品代理合同
- 2025年文獻檢索理論試題
- 金融機構安全保衛服務合同范例
- 國際勞務派遣擔保協議
- 高新技術產業場勞動合同范本
- 2024年四川金融控股集團有限公司招聘筆試真題
- 沃爾瑪收貨管理制度
- 鐵塔施工方案(3篇)
- 2024初級會計職稱考試《經濟法基礎》真題和答案
- 包裝公司日常管理制度
- 2025年遼寧省沈陽市于洪區中考數學二模試卷
- 四川雅安天立學校2025年七下數學期末預測試題含解析
- 駕校退款協議書
- 2025年中國石油套管油管市場現狀分析及前景預測報告
- 美縫合同協議書
評論
0/150
提交評論