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

正文內(nèi)容

復(fù)件簡(jiǎn)易web服務(wù)器研究—vc畢業(yè)設(shè)計(jì)—計(jì)算機(jī)畢業(yè)設(shè)計(jì)(編輯修改稿)

2025-01-08 20:48 本頁(yè)面
 

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