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

正文內(nèi)容

畢業(yè)論文-modbus通信協(xié)議在tcpip上的實(shí)現(xiàn)(編輯修改稿)

2024-12-13 20:59 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 addr FAR* addr, int FAR* addrlen )。 s:是一個(gè)套接字,它應(yīng)處于監(jiān)聽狀態(tài)。 addr:是一個(gè) sockaddr_in 結(jié)構(gòu)指針,包含一組客戶端的端口號(hào)、 IP 地址等信息。 addrlen:用于接收參數(shù) addr 的長(zhǎng)度。 ( 6) send()和 recv()函數(shù) TCP 連接建立以后,數(shù)據(jù)即可被傳送。將 send()和 recv()函數(shù)專門設(shè)計(jì)成和已經(jīng)連接的套接字一起使用。 ( 7) close()函數(shù) 一旦不使用,通過(guò)該函數(shù)關(guān)閉套接字。 應(yīng)用程序與套接字關(guān)系 系統(tǒng)調(diào)用 大多數(shù)操作 系統(tǒng)使用系統(tǒng)調(diào)用 (system call)的機(jī)制在應(yīng)用程序和操作系統(tǒng)之間傳遞控制權(quán)。對(duì)程序員來(lái)說(shuō),每一個(gè)系統(tǒng)調(diào)用和一般程序設(shè)計(jì)中的函數(shù)調(diào)用非常相似,只是系統(tǒng)調(diào)用是將控制權(quán)傳遞給了操作系統(tǒng)。如下圖所示: 應(yīng)用程序 1 應(yīng)用程序 2 應(yīng)用程序 n由應(yīng)用程序調(diào)用的系統(tǒng)函數(shù)系統(tǒng)調(diào)用接口用戶地址空間中的應(yīng)用程序系統(tǒng)地址空間中的協(xié)議軟件包括 T C P / IP 軟件協(xié)議的操作系統(tǒng)內(nèi)核? ? 應(yīng)用編程接口 API (Application Programming Interface) 如上圖所示,當(dāng)某個(gè)應(yīng)用進(jìn)程啟動(dòng) 系統(tǒng)調(diào)用 時(shí),控制權(quán)就從應(yīng)用進(jìn)程傳遞給了 系統(tǒng)調(diào)用接口 。操作系統(tǒng)將此接口再將控制權(quán)傳遞給計(jì)算機(jī)的操作 系統(tǒng)。此調(diào)用轉(zhuǎn)給某個(gè)內(nèi)部過(guò)程,并執(zhí)行所請(qǐng)求的操作。內(nèi)部過(guò)程一旦執(zhí)行完畢,控制權(quán)就又通過(guò)系統(tǒng)調(diào)用接口返回給應(yīng)用進(jìn)程。 由上可知, 系統(tǒng)調(diào)用接口實(shí)際上就是 應(yīng)用進(jìn)程的控制權(quán)和操作系統(tǒng)的控制權(quán)進(jìn)行轉(zhuǎn)換的一個(gè)接口,即 應(yīng)用編程接口 API。 套接字( Socket)就是由操作系統(tǒng)提供的一組有關(guān) TCP/IP 的 API1。 套接字( Socket)的作用 如下圖所示,應(yīng)用進(jìn)程通過(guò)套接字接入到網(wǎng)絡(luò) 。 應(yīng) 用 進(jìn) 程套 接 字T C P客 戶應(yīng) 用 進(jìn) 程套 接 字T C P因 特 網(wǎng)因 特 網(wǎng)客 戶由 操 作 系統(tǒng) 控 制由 應(yīng) 用程 序 控制 第四章 課題的 具體實(shí)現(xiàn)流程 編程環(huán)境 VC++與面向?qū)ο? Windows 編程采用的是面向?qū)ο蟮姆椒?( Object Oriented Programming,簡(jiǎn)稱 OOP) 。要編寫真正的 Windows 應(yīng)用程序,就必須對(duì) OOP 有一定了解。而 Visual C++是 Windows 環(huán)境下最主要的開發(fā)環(huán)境,它支持面向?qū)ο缶幊?,并提供可視化編程? 面向?qū)ο缶幊碳夹g(shù)不只是一種程序設(shè)計(jì)的方法,而是客觀建立事物模型,分析復(fù)雜事物思想的方法。面向?qū)ο蠓椒ǖ谋举|(zhì),就是強(qiáng)調(diào)從客觀事物固有的事物出發(fā)來(lái)構(gòu)造系統(tǒng),用 人類常用的思維方式來(lái)認(rèn)、理解和描述事物。 利 面向?qū)ο蟮某绦蛟O(shè)計(jì)的核心為: 設(shè)計(jì)思路:對(duì)客觀事物的抽象。 程序特點(diǎn):對(duì)類(對(duì)象的存在形式)進(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)。 類提供簡(jiǎn)單的對(duì)外接口。 面向?qū)ο蠹夹g(shù)的基本特征為: 繼承性:繼承性是指一個(gè)新類可以從現(xiàn)有的類中派生出來(lái),新類具有父類中的所有特性,直接繼承父類的方法和數(shù)據(jù),新類的對(duì)象可以調(diào)用該類及父類的成員變量和成員函數(shù)。 封裝性:封裝性是指把數(shù)據(jù)和方法放在同一個(gè)對(duì)象中,對(duì)數(shù)據(jù)的存取只能通過(guò)該對(duì)象本身的方法來(lái)進(jìn)行。 多態(tài)性:是指同一消息被不同 的對(duì)象界首市,可以解釋為不同意義的能力,會(huì)產(chǎn)生不同的行為。 Visual C++ /MFC 開發(fā)程序 庫(kù)( library)是可以重復(fù)使用的源代碼和目標(biāo)代碼的集合。 MFC( Microsoft Fundamental Classes)是 Visual C++開發(fā)環(huán)境所帶的類庫(kù),在該類庫(kù)中提供了大量的類,可以幫助開發(fā)人員快速建立應(yīng)用程序。這些類可以提供程序框架、進(jìn)行文件和數(shù)據(jù)庫(kù)操作、建立網(wǎng)絡(luò)連接、進(jìn)行繪圖和打印等各種通用的應(yīng)用程序操作。使用 MFC 庫(kù)開發(fā)應(yīng)用程序可以減少很多工作量。 MFC 借助 C++的優(yōu) 勢(shì)為 Windows 開發(fā)開辟了一片新天地,同時(shí)也借 助ApplicationWizzard 使開發(fā)者擺脫離了那些每次都必寫基本代碼,借 ClassWizard2和消息映射使開發(fā)者擺脫了定義消息處理時(shí)那種混亂和冗長(zhǎng)的代碼段。更令人興奮的是利用 C++的封裝功能使開發(fā)者擺脫 Windows 中各種句柄的困擾,只需要面對(duì) C++中的對(duì)象,這樣一來(lái)使開發(fā)更接近開發(fā)語(yǔ)言而遠(yuǎn)離系統(tǒng)。 編程語(yǔ)言 正因?yàn)?MFC 是建立在 C++的基礎(chǔ)上,所以我強(qiáng)調(diào) C/C++語(yǔ)言基礎(chǔ)對(duì)開發(fā)的重要性。利用 C++的封裝性開發(fā)者可以更容易理解和操作各種窗口對(duì)象;利用C++的派生性開發(fā)者可以減少開發(fā)自定義窗口的時(shí)間和創(chuàng)造出可重用的代碼;利用虛擬性可以在必要時(shí)更好的控制窗口的活動(dòng)。而且 C++本身所具備的超越 C語(yǔ)言的特性都可以使開發(fā)者編寫出更易用,更靈活的代碼。 現(xiàn)在 C++由以下四個(gè)子語(yǔ)言 組成: C 子語(yǔ)言。 C++支持 C 語(yǔ)言的幾乎全部功能,在語(yǔ)法上與 C 語(yǔ)言僅有極微妙的差別。 面向?qū)ο蟮?C++。 C++首先作為一門面向?qū)ο蟮恼Z(yǔ)言而聞名,這個(gè)特點(diǎn)在這里不再詳述。 泛型編程語(yǔ)言。 C++強(qiáng)大模板功能使它能在編譯期完成許多工作,從而大大提高運(yùn)行期效率 。 STL3。隨著 STL 的不斷發(fā)展,它已經(jīng)逐漸成為 C++程序設(shè)計(jì)中不可或缺的部分,其效率可能比一般的 na239。ve 代碼低些,但是其 安全 性與規(guī)范性使它大受歡迎。 套接字實(shí)現(xiàn)流程 1 、 套接字工作原理 (1) 當(dāng)應(yīng)用進(jìn)程需要使用網(wǎng)絡(luò)進(jìn)行通信時(shí)就發(fā)出系統(tǒng)調(diào)用,請(qǐng)求操作系統(tǒng)為其創(chuàng)建 “套接字 ”,以便把網(wǎng)絡(luò)通信所需要的系統(tǒng)資源分配給該應(yīng)用進(jìn)程。 (2) 操作系 統(tǒng)為這些資源的總和用一個(gè)叫做套接字描述符的號(hào)碼來(lái)表示,并把此號(hào)碼返回給應(yīng)用進(jìn)程。應(yīng)用進(jìn)程所進(jìn)行的網(wǎng)絡(luò)操作都必須使用這個(gè)號(hào)碼。 (3) 通信完畢后,應(yīng)用進(jìn)程通過(guò)一個(gè)關(guān)閉套接字的系統(tǒng)調(diào)用通知操作系統(tǒng)回收與該 “號(hào)碼 ”相關(guān)的所有資源。 創(chuàng)建套接字 (流程把文字改成程序流程圖) 服務(wù)器端: 當(dāng)套接字被創(chuàng)建后,它的端口號(hào)和 IP 地址都是空的,因此應(yīng)用進(jìn)程要調(diào)用 bind(綁定) 來(lái)指明套接字的本地地址。例如,在服務(wù)器端調(diào)用 bind 時(shí) 就是 把熟知端口號(hào)和本地 IP地址填寫到已創(chuàng)建的套接字中。這就叫做 把本 地地址綁定到套接字 。服務(wù)器在調(diào)用 bind 后,還 必須 調(diào)用 listen(收聽) 把套接字設(shè)置為 被動(dòng)方式 ,以便隨時(shí)接受客戶的服務(wù)請(qǐng)求。 UDP4服務(wù)器由于只提供無(wú)連接服務(wù),不使用 listen 系統(tǒng)調(diào)用 。 服務(wù)器緊接著就調(diào)用 accept(接受) ,以便把遠(yuǎn)地客戶進(jìn)程發(fā)來(lái)的連接請(qǐng)求提取出來(lái)。系統(tǒng)調(diào)用 accept 的一個(gè)變量就是要指明從哪一個(gè)套接字發(fā)起的連接。 具體的服務(wù)器端進(jìn)程如下所示: if(! AfxSocketlnit()){ MessageBox(“ WindowsSocket initial failed!”,“ Send”, MB— ICONSTOP); Return; }//套接字初始化 CSocket ChatSend, Server;//構(gòu)造 2個(gè)套接字對(duì)象, nPort是 socket的端口號(hào)。 if(!Chatsend. Create(nPort)){//初始化 socket. MessageBox ( “ SendSocket create failed!”, MB— ICONSTOP); Return ; else ChatSend. Bind(nPort, strAddr);//把本地址和 socket綁定 ,其中 nPort是 socket的端口號(hào), strAddr是機(jī)器的 IP地址。 ChatSend. Listen();//開始偵聽 ChatSend. Accept(server);//新的套接字上接收客戶端 socket連接 } Server. SendTo(csSendText. csCount, nPurt, strAddr);//發(fā)送一個(gè)字符串 Server. close();//關(guān)閉這 2個(gè) socket ChatSend Close(); 流程:文字改成程序流程圖 客戶端: 它比較簡(jiǎn)單,第一 , 創(chuàng)建套接字 socket,第 二,通過(guò) connect 函數(shù)向服務(wù)器發(fā)出連接請(qǐng)求,然后就可以通過(guò) send, recv 函數(shù)發(fā)送和 接 收信息了。 具體客戶端進(jìn)程代碼如下所示: if(!AfxSocketlnit()){ MessageBox( “WindowsSocket initial failed!” , “Receive”, MB— ICONSTOP); Return; }//套接字初始化 bcket ChatReceive;//構(gòu)建一個(gè) Socket對(duì)象 if(!ChatReceive. Geste(nPort)){//初始化 socket. MessageBox(“Receive. Socket create failed !” , “Receive”, MB— ICONSTOP); Return; } else{ChatReceive. Connect(strAdamp。, nPort);//建立和服務(wù)器的連接 } ChatReceive. ReceiveFrcgn(csReceiveText, csCount, strAddr, nPort);//接收字符串 ChatReceive. Close();//關(guān)閉套接字 socket MODBUS 協(xié)議編程實(shí) 現(xiàn) (一)通訊口設(shè)置 DCB dcb。 hCom=CreateFile(COM1, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)。 if(hCom==INVALID_HANDLE_VALUE) { MessageBox(createfile error,error)。 } BOOL error=SetupComm(hCom,1024,1024)。 if(!error) MessageBox(setupm error)。 error=GetCommState(hCom,amp。dcb)。 if(!error) MessageBox(getmstate,error)。 =2400。 =8。 =EVENPARITY。//NOPARITY。 =ONESTOPBIT。 error=SetCommState(hCom,amp。dcb)。 (二) CRC 校驗(yàn)碼計(jì)算 UINT crc void calccrc(BYTE crcbuf) { BYTE i。 crc=crc ^ crcbuf。 for(i=0。i8。i++) { BYTE TT。 TT=crcamp。1。 crc=crc1。 crc=crcamp。0x7fff。 if (TT==1) crc=crc^0xa001。 crc=crcamp。0xffff。 } } (三)數(shù)據(jù)發(fā)送 zxaddr=11。//讀取地址為 11 的巡檢表數(shù)據(jù) zxnum=10。//讀取十個(gè)通道的數(shù)據(jù) writebuf2[0]=zxaddr。 writebuf2[1]=3。 writebuf2[2]=0。 writebuf2[3]=0。 writebuf2[4]=0。 writebuf2[5]=zxnum。 crc=0xffff。 calccrc(writebuf2[0])。 calccrc(writebuf2[1
點(diǎn)擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計(jì)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1