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

正文內(nèi)容

通信協(xié)議與網(wǎng)絡(luò)程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)書(編輯修改稿)

2025-06-28 00:32 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 (wVersionRequested, amp。wsaData)。//給錯(cuò)誤信息賦值if(err!=0){  return。//告訴用戶找不到合適的版本}//確認(rèn) Windows Sockets DLL 支持 版本//DLL 版本可以高于 //系統(tǒng)返回的版本號(hào)始終是最低要求的 ,即應(yīng)用程序與DLL 中可支持的最低版本號(hào)if(LOBYTE()!= 1|| HIBYTE()!=1){  WSACleanup()。//告訴用戶找不到合適的版本  return。}//Windows Sockets DLL 被進(jìn)程接受,可以進(jìn)入下一步操作關(guān)閉函數(shù)使用時(shí),任何打開并已連接的 SOCK_STREAM 套接字被復(fù)位,但那些已由 closesocket() 函數(shù)關(guān)閉的但仍有未發(fā)送數(shù)據(jù)的套接字不受影響,未發(fā)送的數(shù)據(jù)仍將被發(fā)送。程序運(yùn)行時(shí)可能會(huì)多次調(diào)用 WSAStartuo() 函數(shù),但必須保證每次調(diào)用時(shí)的 wVersionRequested 的值是相同的。(2)異步請(qǐng)求服務(wù)Windows Sockets 除支持 Berkeley Sockets 中同步請(qǐng)求,還增加了了一類異步請(qǐng)求服務(wù)函數(shù) WSAAsyncGerXByY()。該函數(shù)是阻塞請(qǐng)求函數(shù)的異步版本。應(yīng)用程序調(diào)用它時(shí),由 Windows Sockets DLL 初始化這一操作并返回調(diào)用者,此函數(shù)返回一個(gè)異步句柄,用來標(biāo)識(shí)這個(gè)操作。當(dāng)結(jié)果存儲(chǔ)在調(diào)用者提供的緩沖區(qū),并且發(fā)送一個(gè)消息到應(yīng)用程序相應(yīng)窗口。常用結(jié)構(gòu)如下:HANDLE taskHnd。char hostname=rs6000。taskHnd = WSAAsyncBetHostByName(hWnd,wMsg,hostname,buf,buflen)。 需要注意的是,由于 Windows 的內(nèi)存對(duì)像可以設(shè)置為可移動(dòng)和可丟棄,因此在操作內(nèi)存對(duì)象是,必須保證 WIindows Sockets DLL 對(duì)象是可用的。 (3)異步數(shù)據(jù)傳輸使用 send() 或 sendto() 函數(shù)來發(fā)送數(shù)據(jù),使用 recv() 或recvfrom() 來接收數(shù)據(jù)。Windows Sockets 不鼓勵(lì)用戶使用阻塞方式傳輸數(shù)據(jù),因?yàn)槟菢涌赡軙?huì)阻塞整個(gè) Windows 環(huán)境。下面我們看一個(gè)異步數(shù)據(jù)傳輸實(shí)例:假設(shè)套接字 s 在連接建立后,已經(jīng)使用了函數(shù) WSAAsyncSelect() 在其上注冊(cè)了網(wǎng)絡(luò)事件 FD_READ 和 FD_WRITE,并且 wMsg 值為 UM_SOCK,那么我們可以在 Windows 消息循環(huán)中增加如下的分支語(yǔ)句:case UM_SOCK:  switch(lParam)  {  case FD_READ:    len = recv(wParam,lpBuffer,length,0)?!   reak?! ase FD_WRITE:    while(send(wParam,lpBuffer,len,0)!=SOCKET_ERROR)    break?! break。 (4)出錯(cuò)處理Windows 提供了一個(gè)函數(shù)來獲取最近的錯(cuò)誤碼 WSAGetLastError(),推薦的編寫方式如下: len = send (s,lpBuffer,len,0)。if((len==SOCKET_ERROR)amp。amp。(WSAGetLastError()==WSAWOULDBLOCK)){...}(二)關(guān)于使用套接字編程的一些基本概念半相關(guān)與全相關(guān)半相關(guān)在網(wǎng)絡(luò)中用一個(gè)三元組可以在全局唯一標(biāo)志一個(gè)進(jìn)程: (協(xié)議,本地地址,本地端口號(hào))這樣一個(gè)三元組,叫做一個(gè)半相關(guān)(halfassociation),它指定連接的每半部分。全相關(guān)一個(gè)完整的網(wǎng)間進(jìn)程通信需要由兩個(gè)進(jìn)程組成,并且只能使用同一種高層協(xié)議。也就是說,不可能通信的一端用TCP協(xié)議,而另一端用UDP協(xié)議。因此一個(gè)完整的網(wǎng)間通信需要一個(gè)五元組來標(biāo)識(shí):(協(xié)議,本地地址,本地端口號(hào),遠(yuǎn)地地址,遠(yuǎn)地端口號(hào))這樣一個(gè)五元組,叫做一個(gè)相關(guān)(association),即兩個(gè)協(xié)議相同的半相關(guān)才能組合成一個(gè)合適的相關(guān),或完全指定組成一連接。TCP/IP協(xié)議的地址結(jié)構(gòu)為: struct sockaddr_in{ short sin_family。 /*AF_INET*/ u_short sin_port。 /*16位端口號(hào),網(wǎng)絡(luò)字節(jié)順序*/ struct in_addr sin_addr。 /*32位IP地址,網(wǎng)絡(luò)字節(jié)順序*/ char sin_zero[8]。 /*保留*/ } (c)套接字類型TCP/IP的socket提供下列三種類型套接字。 流式套接字(SOCK_STREAM)提供了一個(gè)面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無差錯(cuò)、無重復(fù)地發(fā)送,且發(fā)送順序接收。內(nèi)設(shè)流量控制,避免數(shù)據(jù)流超限;數(shù)據(jù)被看作是字節(jié)流,無長(zhǎng)度限制。文件傳送協(xié)議(FTP)即使用流式套接字。數(shù)據(jù)報(bào)式套接字(SOCK_DGRAM)提供了一個(gè)無連接服務(wù)。數(shù)據(jù)包以獨(dú)立包形式被發(fā)送,不提供無錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù),并且接收順序混亂。網(wǎng)絡(luò)文件系統(tǒng)(NFS)使用數(shù)據(jù)報(bào)式套接字。原始式套接字(SOCK_RAW)該接口允許對(duì)較低層協(xié)議,如IP、ICMP直接訪問。常用于檢驗(yàn)新的協(xié)議實(shí)現(xiàn)或訪問現(xiàn)有服務(wù)中配置的新設(shè)備。五、實(shí)驗(yàn)報(bào)告(必要時(shí)應(yīng)準(zhǔn)備多組數(shù)據(jù))(應(yīng)加適當(dāng)?shù)淖⑨?,可讀性好)(出錯(cuò)及解決方法,上機(jī)調(diào)試的結(jié)果和體會(huì))實(shí)驗(yàn)三 TCP套接字編程一、實(shí)驗(yàn)?zāi)康耐ㄟ^編寫簡(jiǎn)單的Windows窗口、基于MFC的計(jì)算器以及車站售票程序(多線程實(shí)現(xiàn)),深入了解VC++的開發(fā)環(huán)境,掌握常用的控件使用方法和程序編寫過程。二、 實(shí)驗(yàn)內(nèi)容:回程時(shí)延。,然后立即接受從服務(wù)器端原樣返回的數(shù)據(jù)。三、 實(shí)驗(yàn)環(huán)境Windows操作系統(tǒng)、VC++四、 實(shí)驗(yàn)指導(dǎo)(一)WinSock的擴(kuò)充異步方式指的是發(fā)送方不等接收方響應(yīng),便接著發(fā)下個(gè)數(shù)據(jù)包的通信方式;而同步指發(fā)送方發(fā)出數(shù)據(jù)后,等收到接收方發(fā)回的響應(yīng),才發(fā)下一個(gè)數(shù)據(jù)包的通信方式。 阻塞套接字是指執(zhí)行此套接字的網(wǎng)絡(luò)調(diào)用時(shí),直到成功才返回,否則一直阻塞在此網(wǎng)絡(luò)調(diào)用上,比如調(diào)用recv()函數(shù)讀取網(wǎng)絡(luò)緩沖區(qū)中的數(shù)據(jù),如果沒有數(shù)據(jù)到達(dá),將一直掛在recv()這個(gè)函數(shù)調(diào)用上,直到讀到一些數(shù)據(jù),此函數(shù)調(diào)用才返回;而非阻塞套接字是指執(zhí)行此套接字的網(wǎng)絡(luò)調(diào)用時(shí),不管是否執(zhí)行成功,都立即返回。比如調(diào)用recv()函數(shù)讀取網(wǎng)絡(luò)緩沖區(qū)中數(shù)據(jù),不管是否讀到數(shù)據(jù)都立即返回,而不會(huì)一直掛在此函數(shù)調(diào)用上。在實(shí)際Windows網(wǎng)絡(luò)通信軟件開發(fā)中,異步非阻塞套接字是用的最多的。 (同步阻塞、異步非阻塞) ,那就是當(dāng)你從不調(diào)用WSAIoctl()和ioctlsocket()來改變Socket IO模式,也從不調(diào)用WSAAsyncSelect()和WSAEventSelect()來選擇需要處理的Socket事件。正是由于函數(shù)accept(),WSAAccept(),connect(),WSAConnect(),send(),WSASend(),recv(),WSARecv()等函數(shù)被用作阻塞方式,所以可能你需要放在專門的線程里,這樣以不影響主程序的運(yùn)行和主窗口的刷新。,那么程序主要就是要處理事件。它有兩種處理事件的辦法: 第一種,它常關(guān)聯(lián)一個(gè)窗口,也就是異步Socket的事件將作為消息發(fā)往該窗口,這是由WinSock擴(kuò)展規(guī)范里的一個(gè)函數(shù)WSAAsyncSelect()來實(shí)現(xiàn)和窗口關(guān)聯(lián)。最終你只需要處理窗口消息,來收發(fā)數(shù)據(jù)。第二種,用到了擴(kuò)展規(guī)范里另一個(gè)關(guān)于事件的函數(shù)WSAEventSelect(),它是用事件對(duì)象的方式來處理Socket事件,也就是,你必須首先用WSACreateEvent()來創(chuàng)建一個(gè)事件對(duì)象,然后調(diào)用WSAEventSelect()來使得Socket的事件和這個(gè)事件對(duì)象關(guān)聯(lián)。最終你將要在一個(gè)線程里用WSAWaitForMultipleEvents()來等待這個(gè)事件對(duì)象被觸發(fā)。這個(gè)過程也稍顯復(fù)雜。windows socket api WINSOCK對(duì)BSD Socket的擴(kuò)充主要是在基于消息、對(duì)網(wǎng)絡(luò)事件的異步存取接口上。下表列出了WINSOCK擴(kuò)充的函數(shù)功能。 函 數(shù) 名 功 能 WSAAsyncGetHostByAddr() 標(biāo)準(zhǔn)Berkeley函數(shù)getXbyY的異步版本,例 WSAAsyncGetHostByName() 如:函數(shù)WSAAsyncGetHostByName()就是提 WSAAsyncGetProtoByName() 供了標(biāo)準(zhǔn)Berkeley函數(shù)gethostbyname的一 WSAAsyncGetProtoByNumber() 種基于消息的異步實(shí)現(xiàn)。 WSAAsyncGetServByName() WSAAsyncGetServByPort() WSAAsyncSelect() 函數(shù)select()的異步版本 WSACancelAsyncRequest() 取消函數(shù)WSAAsyncGetXByY執(zhí)行中的實(shí)例 WSACancelBlockingCall() 取消一個(gè)執(zhí)行中的“阻塞”API調(diào)用 WSACleanup() 終止使用隱含的Windows Sockets DLL WSAGetLastError() 獲取Windows Sockets API的最近錯(cuò)誤號(hào) WSAIsBlocking() 檢測(cè)隱含的Windows Sockets DLL是否阻塞了一個(gè)當(dāng)前線索的調(diào)用 WSASetBlockingHook() 設(shè)置應(yīng)用程序自己的“阻塞”處理函數(shù) WSASetLastError() 設(shè)置Windows Sockets API的最近錯(cuò)誤號(hào) WSAStartup() 初始化隱含的Windows Sockets DLL WSAUnhookBlockingHook() 恢復(fù)原來的“阻塞”處理函數(shù) 從表1可以看出,WINSOCK的擴(kuò)充功能可以分為如下幾類: (1)異步選擇機(jī)制: 異步選擇函數(shù)WSAAsyncSelect()允許應(yīng)用程序提名一個(gè)或多個(gè)感興趣的網(wǎng)絡(luò)事件,所有阻塞的網(wǎng)絡(luò)I/O例程(如send()和resv()),不管它是已經(jīng)使用還是即將使用,都可作為WSAAsyncSelect()函數(shù)選擇的候選。當(dāng)被提名的網(wǎng)絡(luò)事件發(fā)生時(shí),Windows應(yīng)用程序的窗口函數(shù)將收到一個(gè)消息,消息附帶的參數(shù)指示被提名過的某一網(wǎng)絡(luò)事件。 (2)異步請(qǐng)求例程: 異步請(qǐng)求例程允許應(yīng)用程序用異步方式獲取請(qǐng)求的信息,如WSAAsyncGetXByY()類函數(shù)允許用戶請(qǐng)求異步服務(wù),這些功能在使用標(biāo)準(zhǔn)Berkeley函數(shù)時(shí)是阻塞的。函數(shù)WSACancelAsyncRequest()允許用戶終止一個(gè)正在執(zhí)行的異步請(qǐng)求。 (3)阻塞處理方法: WINSOCK在調(diào)用處于阻塞時(shí)進(jìn)入一個(gè)叫“Hook”的例程,它負(fù)責(zé)處理Windows消息,使得Windows的消息循環(huán)能夠繼續(xù)。WINSOCK還提供了兩個(gè)函數(shù)(WSASetBlockingHook()和WSAUnhookBlockingHook())讓用戶能夠設(shè)置和取消自己的阻塞處理例程。另外,函數(shù)WSAIsBlocking()可以檢測(cè)調(diào)用是否阻塞,函數(shù)WSACancelBlockingCall()可以取消一個(gè)阻塞的調(diào)用。 (4)出錯(cuò)處理: 為了和以后的多線索環(huán)境(如Windows/NT)兼容,WINSOCK提供了兩個(gè)出錯(cuò)處理函數(shù)WSAGetLastError()和WSASetLastError()來獲取和設(shè)置本線索的最近錯(cuò)誤號(hào)。 (5)啟動(dòng)與終止: WINSOCK的應(yīng)用程序在使用上述WINSOCK函數(shù)前,必須先調(diào)用WSAStartup()函數(shù)對(duì)Windows Sockets DLL進(jìn)行初始化,以協(xié)商WINSOCK的版本支持,并分配必要的資源。在應(yīng)用程序退出之前,應(yīng)該先調(diào)用函數(shù)WSAClearnup()終止對(duì)Windows Sockets DLL的使用,并釋放資源,以利下一次使用。 在這些函數(shù)中,實(shí)現(xiàn)Windows網(wǎng)絡(luò)實(shí)時(shí)通信的關(guān)鍵是異步選擇函數(shù)WSAAsyncSelect()的使用,其原型如下: int PASCAL FAR WSAAsyncSelect(SOCTET s,HWND hWnd,unsigned int wMsg,long lEvent)。 它請(qǐng)求Windows Sockets DLL在檢測(cè)到在套接字s上發(fā)生的lEvent事件時(shí),向窗口hWnd發(fā)送一個(gè)消息wMsg。它自動(dòng)地設(shè)置套接字s處于非阻塞工作方式。參數(shù)lEvent由下列事件的一個(gè)或多個(gè)組成: 值 含 義 FD_READ 希望在套接字s收到數(shù)據(jù)(即讀準(zhǔn)備好)時(shí)接到通知 FD_WRITE 希望在套接字s可發(fā)送數(shù)據(jù)(即寫準(zhǔn)備好)時(shí)接到通知 FD_OOB 希望在套接字s上有帶外數(shù)據(jù)到達(dá)時(shí)接到通知 FD_ACCEPT 希望在套接字s上有外部連接到來時(shí)接到通知 FD_CONNECT 希望在套接字s連接建立完成時(shí)接到通知 FD_CLOSE 希望在套接字s關(guān)閉時(shí)接到通知 表2. 異步選擇網(wǎng)絡(luò)事件表 例如,我們要在套接字s讀準(zhǔn)備好或?qū)憸?zhǔn)備好時(shí)接到通知,可以使用下面的語(yǔ)句: rc = WSAAsyncSelect(s, hWnd, wMsg, FD_READ | FD_WRITE)。 當(dāng)套接字s上被提名的一個(gè)網(wǎng)絡(luò)事件發(fā)生時(shí),窗口hWnd將收到消息wMsg,變量lParam的低字指示網(wǎng)絡(luò)發(fā)生的事件,高字指示錯(cuò)誤碼。應(yīng)用程序就可以通過這些信息來決定自己的下一步動(dòng)作。(二)一個(gè)簡(jiǎn)單的TCP客戶服務(wù)員程序的服務(wù)員程序: include include include include sys/include include include include define SERV_TCP_PORT 6000 /*服務(wù)員進(jìn)程端口號(hào),視具體情況而定*/define SERV_HOST_ADDR /*服務(wù)員IP,視具體情況而定*/int sockfd。 ////////////////////////////////////////////////////////////////////////////線程用來處理客戶端的請(qǐng)求
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1