freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

復件簡易web服務器研究—vc(論文)—免費(編輯修改稿)

2025-01-12 01:03 本頁面
 

【文章內(nèi)容簡介】 可以建立的最大連接數(shù) (目前最大值限制為 5, 最小值為 1)。該函數(shù)調(diào)用成功返回 0,否則返回 SOCKET_ERROR。 18 int PASCAL FAR listen( SOCKET s, int backlog )。 參 數(shù): s:需要建立監(jiān)聽的 Socket; backlog:最大連接個數(shù); 服務器端的 Socket調(diào)用完 listen()后,如果此時客戶端調(diào)用 connect()函數(shù)提出連接申請的話, Server 端必須再調(diào)用 accept() 函數(shù),這樣服務器端和客戶端才算正式完成通信程序的連接動作。為了知道什么時候客戶端提出連接要求,從而服務器端的 Socket 在恰當?shù)臅r候調(diào)用 accept()函數(shù)完成連接的建立,我們就要使用 WSAAsyncSelect()函數(shù),讓系統(tǒng)主動來通知有客戶端提出連接請求了。該函數(shù)調(diào)用成功返回 0,否則返回 SOCKET_ERROR。 int PASCAL FAR WSAAsyncSelect( SOCKET s, HWND hWnd,unsigned int wMsg, long lEvent )。 參數(shù): s: Socket 對象; hWnd :接收消息的窗口句柄; wMsg:傳給窗口的消息; lEvent:被注冊的網(wǎng)絡事件,也即是應用程序向窗口發(fā)送消息的網(wǎng)路事件,該值為下 列值 FD_READ、 FD_WRITE、 FD_OOB、 FD_ACCEPT、 FD_CONNECT、 FD_CLOSE 的組合,各個值的具體含意為 FD_READ:希望在套接字 S 收到數(shù)據(jù)時收到 消息; FD_WRITE:希望在套接字 S 上可以發(fā)送數(shù)據(jù)時收到消息; FD_ACCEPT:希望在套接字 S 上收到連接請求時收到消息; FD_CONNECT:希望在套接字 S 上連接成功時收到消息; FD_CLOSE:希望在套接字 S上連接關閉時收到消息; FD_OOB:希望在套接字 S 上收到帶外數(shù)據(jù)時收到消息。 具體應用時, wMsg 應是在應用程序中定義的消息名稱,而消息結(jié)構(gòu)中的 lParam 則為以上各種網(wǎng)絡事件名稱。所以,可以在窗口處理自定義消息函數(shù)中使用以下結(jié)構(gòu)來響應Socket 的不同事件: switch(lParam) { case FD_READ: … break。 case FD_WRITE、 … break。 … } (五 ) 服務器端接受客戶端的連接請求 當 Client 提出連接請求時, Server 端 hwnd視窗會收到 Winsock Stack 送來我們自定義的 19 一個消息,這時,我們可以分析 lParam,然后調(diào)用相關的函數(shù)來處理此事件。為了使服務器端接受客戶端的連接請求,就要使用 accept() 函 數(shù),該函數(shù)新建一 Socket與客戶端的 Socket相通,原先監(jiān)聽之 Socket 繼續(xù)進入監(jiān)聽狀態(tài),等待他人的連接要求 。該函數(shù)調(diào)用成功返回一個新產(chǎn)生的 Socket 對象, 否則返回 INVALID_SOCKET。 (六) 結(jié)束 socket 連接 結(jié)束服務器和客戶端的通信連接是很簡單的,這一過程可以由服務器或客戶機的任一端啟動,只要調(diào)用 closesocket()就可以了,而要關閉 Server 端監(jiān)聽狀態(tài)的 socket,同樣也是利用此函數(shù)。另外,與程序啟動時調(diào)用 WSAStartup()憨數(shù)相對應,程式結(jié)束前,需要調(diào)用 WSACleanup() 來通知 Winsock Stack釋放 Socket 所占用的資源。這兩個函數(shù)都是調(diào)用成功返回 0, 否則返回SOCKET_ERROR。 客戶端 Socket 的操作 (一)建立客戶端的 Socket 客戶端應用程序首先也是調(diào)用 WSAStartup() 函數(shù)來與 Winsock 的動態(tài)連接庫建立關系,然后同樣調(diào)用 socket() 來建立一個 TCP 或 UDP socket(相同協(xié)定的 sockets 才能相通, TCP 對 TCP, UDP 對 UDP)。與服務器端的socket 不同的是,客戶端的 socket 可以調(diào)用 bind() 函數(shù),由自己來指定 IP 地址及 port 號碼;但是也可以不調(diào)用 bind(),而由 Winsock 來自動設定 IP 地址及 port 號碼。 (二)提出連接申請 客戶端的 Socket 使用 connect()函數(shù)來提出與服務器端的 Socket 建立連接的申請,函數(shù)調(diào)用成功返回 0,否則返回 SOCKET_ERROR。 ( 三)數(shù)據(jù)的傳送 雖然基于 TCP/IP 連接協(xié)議(流套接字)的服務是設計客戶機 /服務器應用程序時的主流 20 標準,但有些服務也是可以通過無連接協(xié)議(數(shù)據(jù)報套接字)提供的。先介紹一下TCP socket 與 UDP socket 在傳送數(shù)據(jù)時的特性 : Stream (TCP) Socket 提供雙向、可靠、 有次序、不重復的資料傳送 ; Datagram (UDP) Socket 雖然提供雙向的通信,但沒有可靠、有次序、不重復的保證,所以 UDP 傳送數(shù)據(jù)可能會收到無次序、重復的資料,甚至資料在傳輸過程中出現(xiàn)遺漏。由于 UDP Socket 在傳送資料時,并不保證資料能完整地送達對方,所以絕大多數(shù)應用程序都是采用 TCP 處理 Socket,以保證資料的正確性。 一般情況下TCP Socket 的數(shù)據(jù)發(fā)送和接收是調(diào)用 send() 及 recv() 這兩個函數(shù)來達成,而 UDP Socket 則是用 sendto() 及 recvfrom() 這兩個函數(shù),這兩個函數(shù)調(diào)用成功發(fā) 回 發(fā)送或接收的資料的長度,否則返回 SOCKET_ERROR。 int PASCAL FAR send( SOCKET s, const char FAR *buf,int len, int flags )。 參數(shù): s: Socket 的識別碼 buf:存放要傳送的資料的暫存區(qū) len buf:的長度 flags:此函數(shù)被調(diào)用的方式 對于 Datagram Socket 而言,若是 datagram 的大小超過限制,則將不會送出任何資料,并會傳回錯誤值。對 Stream Socket 言, Blocking 模式下,若是傳送系統(tǒng)內(nèi)的儲存空間不夠存放這些要傳送的資料, send()將會被 block 住,直到資料送完為止;如果該 Socket 被設定為 NonBlocking 模式,那么將視目前的 output buffer 空間有多少,就送出多少資料,并不會被 block 住。 flags 的值可設為 0 或 MSG_DONTROUTE 及 MSG_OOB 的組合 。 int PASCAL FAR recv( SOCKET s, char FAR *buf, int len, int flags )。 參數(shù): s: Socket 的識別碼 buf:存放接收到的資料的暫存區(qū) len buf:的長度 flags:此函數(shù)被調(diào)用的方式 對 Stream Socket 言,我們可以接收到目前 input buffer 內(nèi)有效的資料,但其數(shù)量不超過len 的大小。 應答模塊設計 用戶通過瀏覽器輸入 網(wǎng)頁地址( URL)來訪問服務器,而服務器就要求對其發(fā)送的請求進行相應的分析,分析客戶端的地址,端口,以及請求瀏覽的文件。所以本人所設計的 主干程序為服務器工作線程函數(shù) Serverthread,它主要用于 接受客戶請求的時候,利用多線程來進行處理。其他的函數(shù)還有瀏覽器請求函數(shù),顯示信息函數(shù),錯誤信息函數(shù),及事件處理函數(shù)等。最后實現(xiàn)的 HTTP 服務器具有一般 HTTP服務器最基本的功能,可以發(fā)布用 HTML 語言編寫的網(wǎng)頁,用戶可以在已經(jīng)建立了連接的若干個網(wǎng)頁之間切換瀏覽。 21 服務器工作線程函數(shù) Serverthread 首先我們介紹服務器工作線程函數(shù) Serverthread的基本流程圖 (見下頁)。 22 圖 Serverthread流程圖 圖中很清晰的描述了服務器工作線程函數(shù) Serverthread 的流程,此設計為簡易的 WEB服務器所以只對 HTML請求的第一行就行分析,對于剩下部分不做分析,還有該 HTTP服務器還不能對 CGI請求做出響應,也不能調(diào)用相應的 ISAPI的 DLL(動態(tài)連接庫 )。只能發(fā)送最基本的靜態(tài)文本。 首先我們運行服務器,并開始開啟 WEB服務器功能如圖 。 圖 開啟 WEB服務器功能 這樣在 LISTBOX 中就顯示了 HTTP 服務器開始工作了,在左下腳的狀態(tài)提示框里顯示開始偵聽連接。 之后我們在瀏覽 器的地址欄中輸入我們所架設的服務器的地址,那樣就將我們發(fā)送的請 23 求發(fā)送給服務器,服務器就會記錄下訪問者的地址,時間以及請求的信息,這些信息都會顯示在 LISTBOX中,具體信息如圖 。 圖 記錄請求信息 記錄下了訪問者的信息,那么本人所設計的模塊就針對請求的信息解析,如果是請求瀏覽一個文件,那么就把所要發(fā)布的網(wǎng)頁按一定的大小為單位發(fā)送給客戶,客戶通過瀏覽器端顯示出我們發(fā)送的文檔。如圖 。 圖 如果是請求為空信息那么我們將我們預定義的默認主頁發(fā)送給客戶如圖 。 24 圖 返回默認主頁 服務器工作線程函數(shù) Blocksock 該線程函數(shù)是針對服務器工作中的異常處理,主要包括錯誤信息函數(shù),及事件處理函數(shù)。 錯誤信息函數(shù) GetErrorMessage()將錯誤的信息一定的格式輸出; 事件處理函數(shù)則是對產(chǎn)生的錯誤進行一定的處理,比如創(chuàng)建套接口錯誤,則應拋出異常,讓由 catch 函數(shù)接受,并處理。還有很多很多的錯誤也同樣使用這樣的方法,如綁定地址,偵聽連接,發(fā)送數(shù)據(jù)等等,這一系列的錯誤都應當處理。 在這個線程函數(shù)中還定義了發(fā)送數(shù)據(jù)的函數(shù) MyBlockSocket::Write(),讀取整個頭信息,并在結(jié)尾加上字符串的結(jié)束標志函數(shù) CMyHttpBlockSocket::ReadHttpHeaderLine(),讀取傳輸?shù)男畔⒌钠渌糠趾瘮?shù) CMyHttpBlockSocket::ReadHttpResponse()。這三個函數(shù)都為工作線程 Serverthread 服務。 25 第五章 系統(tǒng)實現(xiàn) 頁面代碼及偵聽模塊實現(xiàn) 各按鈕功能說明和實現(xiàn)代碼 設置路徑:點擊該按鈕,彈出一個 Windows 對話框,設置好網(wǎng)頁所在機子上的服務路徑,再按確定。靜態(tài)文本框( 服務器路徑)顯示該服務路徑。 開始偵聽:點擊該按鈕,服務器開始工作,列表框里顯示“ HTTP 服務器開始工作”。服務器開始偵聽客戶端瀏覽器的 WEB 頁面請求。一旦客戶端瀏覽器輸入所要訪問主機的 IP地址,服務器馬上能偵聽到請求并作出響應。 停止偵聽:服務器停止工作。列表框里面顯示“服務器停止工作”。 關閉窗口:關閉服務器窗口。 按鈕的功能是通過代碼的編寫來實現(xiàn)的。 開始偵聽: void CHttpServerDlg::OnStartServer() { try { CSocketAddress saServer。 if(()) //是否指定服務器的 ip { // 沒有指定 ,所以使用可用的任何 ip,一般是本機 ip saServer = CSocketAddress(INADDR_ANY, (USHORT) g_nPortServer)。 } else { // 使用指定 ip saServer = CSocketAddress(g_strIPServer, (USHORT) g_nPortServer)。 } ()。 //綁定地址 (saServer)。 //開始偵聽 26 ()。 g_bListening = TRUE。 g_nConnection = 0。 //創(chuàng)建服務器工作線程 AfxBeginThread(ServerThreadProc,amp。m_ListInfo, THREAD_PRIORITY_NORMAL)。 // 在 ListBox 中加入信息 (HTTP 服務器開始工作! )。 // 顯示新的狀態(tài),服務器已經(jīng)開動,正在偵聽 (偵聽連接 )。 } catch(CMyBlockSocketException* e) { // 開啟服務的代碼出現(xiàn)異常 // 關閉偵聽端口 ()。 // 在 ListBox 出提示異常出錯 LogBlockingSocketException(amp。m_ListInfo, 主程序: , e)。 // 刪除異常 eDelete()。 } (FALSE)。 (TRUE)。 } 停止偵聽: void CHttpServerDlg::OnBtnStop() { try { // 如果正在偵聽 if(g_bListening) { // 關閉偵聽 ()。 Sleep(300)。 } } 27 catch(CMyBlockSocket
點擊復制文檔內(nèi)容
研究報告相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1