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

正文內(nèi)容

基于vcsocket的多線程網(wǎng)絡聊天系統(tǒng)開發(fā)與設計(編輯修改稿)

2024-12-16 03:24 本頁面
 

【文章內(nèi)容簡介】 er 的連接。 Access 主要適用于中小型應用系統(tǒng),或作為客戶機 /服務器系統(tǒng)中的客戶端數(shù)據(jù)庫。 基于 VC++ Socket 的多線程網(wǎng)絡聊天系統(tǒng)開發(fā)與設計 5 WINDOWS SOCKETS 網(wǎng)絡編程接口 選定 WINDOWS平臺開發(fā)網(wǎng)絡通信程序,可以選擇 WINDOWS的 SOCKETS編程接口, Windows Sockets 是一套開放的、支持多種協(xié)議的 Windows 下的網(wǎng)絡編程接口 [4]?,F(xiàn)在的 Winsock 已經(jīng)基本上實現(xiàn)了與協(xié)議無關(guān),你可以使用 Winsock來調(diào)用多種協(xié)議的功能,但較常使用的是 TCP/IP 協(xié)議。 Windows sockets 無疑是我們 進行網(wǎng)絡編程的利器。所有的 Windows Sockets 實現(xiàn)都支持流套接口和數(shù)據(jù)報套接口。應用程序調(diào)用 Windows Sockets 的 API 實現(xiàn)相互之間的通訊。 Windows Sockets 又利用下層的網(wǎng)絡通訊協(xié)議功能和操作系統(tǒng)調(diào)用實現(xiàn)實際的通訊工作。它們之間的關(guān)系如圖 所示 [5]: 應 用 程 序 1網(wǎng) 絡 編 程 界 面 , 例 如 w i n d o w s S c o k e t s應 用 程 序 2操 作 系 統(tǒng) , 例 如 w i n d o w s物 理 通 訊 介 質(zhì)網(wǎng) 絡 通 信 協(xié) 議 服 務 界 面 , 例 如 T C P / I P 圖 Windows Sockets 實現(xiàn)通訊工作的各層關(guān)系圖 Windows Sockets 編程的一般流程如下 : (1) Winsock 的初始化 [6] 每個 Winsock 應用都必須加載 Winsock DLL 的相應版本。如果調(diào)用 Winsock之前,沒有加載 Winsock 庫,這個函數(shù)就會返回一個 SOCKET_ERR,錯誤信息是 WSANOTINITIALISED。加載 Winsock庫是通過調(diào)用 WSAStartup函數(shù)實現(xiàn)的。這個函數(shù)的定義如下: int WSAStartup(WORD wVersionRequested , LPWSADATA lpWSAData)。 (2) 創(chuàng)建套接字 SOCKET socket(int af, int type, int protocol)。 (3) 把套接字和準備接收數(shù)據(jù)的地址、接口綁定在一起 int bind (SOCKET s, const struct sockaddr FAR *name, int namelen)。 基于 VC++ Socket 的多線程網(wǎng)絡聊天系統(tǒng)開發(fā)與設計 6 (4) 發(fā)送數(shù)據(jù) int sendto ( SOCKET s, //一個可用的 SOCKET const char FAR *buf, //需要傳輸?shù)臄?shù)據(jù) int len, //傳輸數(shù)據(jù)的長度 int flags, //標記 const struct sockaddr FAR *to, //指向存有目的 ip 和端口的結(jié)構(gòu)體 int tolen //目的地址的長度 )。 (5) 接收數(shù)據(jù) int recvfrom (SOCKET s, char FAR * buf, int len, int flags, struct sockaddr FAR *from, int FAR *fromlen)。 (6) 關(guān)閉套接字 多線程開發(fā)技術(shù) 多線程在構(gòu)建大型系統(tǒng) 的時候是需要重點關(guān)注的一個重要方面,特別是在效率(系統(tǒng)跑得多快? )和性能(系統(tǒng)工作正常?)之間做一個權(quán)衡的時候。恰當?shù)氖褂枚嗑€程可以極大的提高系統(tǒng)性能。使用多線程的好處有以下幾點 [7]: 使用線程可以把占據(jù)長時間的程序中的任務放到后臺去處理; 用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發(fā)某些事件的處理,可以彈出一個進度條來顯示處理的進度; 程序的運行速度可能加快; 在一些等待的任務實現(xiàn)上如用戶輸入、文件讀寫和網(wǎng)絡收發(fā)數(shù)據(jù)等,線程就比較有用了。 在這種情況下我們可以釋放一些珍貴的資源如內(nèi)存占用等等。 線程是一個獨立的執(zhí)行流,是進程內(nèi)部的一個獨立的執(zhí)行單元,相當于一個子程序,它對應于 Visual C++中的 CwinThread 類對象。單獨一個執(zhí)行程序運行時,缺省地包含的一個主線程,主線程以函數(shù)地址的形式出現(xiàn),提供程序的啟動點,如 main()或 WinMain()函數(shù)等。當主線程終止時,進程也隨之終止。根據(jù)實際需要,應用程序可以分解成許多獨立執(zhí)行的線程,每個線程并行的運行在同一進程中。線程被分為兩種:用戶界面線程和工作線程(又稱為后臺線程)。用戶界面線程 通常用來處理用戶的輸入并響應各種事件和消息,其實,應用程序的主執(zhí)行線程 CWinAPP 對象就是一個用戶界面線程,當應用程序啟動時自動創(chuàng)建和啟動,同樣它的終止也意味著該程序的結(jié)束,進程終止。工作線程用來執(zhí)行程序的后臺處理任務,比如計算、調(diào)度、對串口的讀寫操作等,它和用戶界面線程的區(qū)別是它不用從 CWinThread 類派生來創(chuàng)建,對它來說最重要的是如何實現(xiàn)工作線程任務的運行控制函數(shù)。工作線程和用戶界面線程啟動時要調(diào)用同一個函數(shù)的基于 VC++ Socket 的多線程網(wǎng)絡聊天系統(tǒng)開發(fā)與設計 7 不同版本 , 一個進程中的所有線程共享它們父進程的變量,但同時每個線程可以擁有自己的變量 [8]。 在 MFC 中,一般用全局函數(shù) AfxBeginThread()來創(chuàng)建并初始化一個線程的運行,該函數(shù)有兩種重載形式,分別用于創(chuàng)建工作者線程和用戶界面線程 [9]。兩種重載函數(shù)原型和參數(shù)分別說明如下: (1) CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam,nPriority=THREAD_PRIORITY_NORMAL, UINT nStackSize=0, DWORD dwCreateFlags=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL)。 PfnThreadProc:指向工作者線程的執(zhí)行函數(shù)的指針,線程函數(shù)原型必須聲明如下: UINT ExecutingFunction(LPVOID pParam)。 請 注意, ExecutingFunction()應返回一個 UINT 類型的值,用以指明該函數(shù)結(jié)束的原因。一般情況下,返回 0 表明執(zhí)行成功。 pParam:傳遞給線程函數(shù)的一個 32 位參數(shù),執(zhí)行函數(shù)將用某種方式解釋該值。它可以是數(shù)值,或是指向一個結(jié)構(gòu)的指針,甚至可被忽略; nPriority:線程的優(yōu)先級。如為 0,則線程與其父線程具有相同優(yōu)先級; nStackSize:線程為自己分配堆棧的大小,其單位為字節(jié)。如果 nStackSize 被設為 0,則線程的堆棧被設置成與父線程堆棧相同大小; dwCreateFlags:如果為 0,則線程在創(chuàng)建后立刻開始執(zhí)行。如果為 CREATE_SUSPEND,則線程在創(chuàng)建后立刻被掛起; lpSecurityAttrs:線程的安全屬性指針,一般為 NULL; (2) CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass, Int nPriority=THREAD_PRIORITY_NORMAL,UINT nStackSize=0,DWORD dwCreateFlags=0,LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL)。 pThreadClass 是指向 CWinThread 的一個導出類的運行時類對象的指針,該導出類定義了被創(chuàng)建的用戶界面線程的啟動、退出等;其它參數(shù)的意義同形式1。使用函數(shù)的這個原型生成的線程也有消息機制,在以后的例子中我們將發(fā)現(xiàn)同主線程的機制 幾乎一樣 。 下面我們對 CWinThread 類的數(shù)據(jù)成員及常用函數(shù)進行簡要 的介紹: m_hThread:當前線程的句柄; m_nThreadID:當前線程的 ID; m_pMainWnd:指向應用程序主窗口的指針; BOOL CWinThread::CreateThread(DWORD dwCreateFlags=0, UINT nStackSize=0,LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL)。 該函數(shù)中的 dwCreateFlags、 nStackSize、 lpSecurityAttrs 參數(shù)和 API 函數(shù)基于 VC++ Socket 的多線程網(wǎng)絡聊天系統(tǒng)開發(fā)與設計 8 CreateThread 中的對應參數(shù)有相同含義,該函數(shù)執(zhí)行成功,返回非 0 值,否則返回 0。 一般情況下,調(diào)用 AfxBeginThread()來一次性地創(chuàng)建并啟動一個線程,但是也可以通過兩步法來創(chuàng)建線程:首先創(chuàng)建 CWinThread 類的一個對象,然后調(diào)用該對象的成員函數(shù) CreateThread()來啟動該線程。 virtual BOOL CWinThread::InitInstance()。 重載該函數(shù)以控制用戶界面線程實例的初始化。初始化成功則返回非 0 值,否 則返回 0。用戶界面線程經(jīng)常重載該函數(shù),工作者線程一般不使用InitInstance()。 在線程終結(jié)前重載該函數(shù)進行一些必要的清理工作。該函數(shù)返回線程的退出碼, 0 表示執(zhí)行成功,非 0 值用來標識各種錯誤。 TCP/IP 協(xié)議、 UDP 協(xié)議 因特網(wǎng)在傳輸層有兩種主要的協(xié)議:一種是面向連接的協(xié)議,一種是無連接的協(xié)議。傳輸控制協(xié)議 TCP 是 (transmission control protocol)專門用于在不可靠的因特網(wǎng)上提供可靠的、端對端的字節(jié)流通信的協(xié)議。通過在發(fā)送方和接收方分別創(chuàng)建一個稱為套接字的通 信端口就可以獲得 TCP 服務。所有的 TCP 連接均是全雙工的和點到點的。 TCP 協(xié)議在 IP 協(xié)議之上。與 IP 協(xié)議提供不可靠傳輸服務不同的是, TCP 協(xié)議為其上的應用層提供了一種可靠傳輸服務。這種服務的特點是:可靠、全雙工、流式和無結(jié)構(gòu)傳輸。它是通過一下步驟來實現(xiàn)可靠傳輸?shù)模?TCP 協(xié)議使用了一個叫積極確認和重發(fā)送 (positive acknowledgement with retransmission)的技術(shù)來實現(xiàn)這一點的。接收者在收到發(fā)送者發(fā)送的數(shù)據(jù)后,必須發(fā)送一個相應的確認( ACK)消息,表示它已經(jīng)收到了數(shù)據(jù)。 發(fā)送者保存發(fā)送的數(shù)據(jù)的記錄,在發(fā)送下一個數(shù)據(jù)之前,等待這個數(shù)據(jù)的確認消息。在它發(fā)送這個數(shù)據(jù)的同時,還啟動了一個記時器。如果在一定時間之內(nèi),沒有接收到確認消息,就認為是這個數(shù)據(jù)在傳送時丟失了,接著,就會重新發(fā)送這個數(shù)據(jù)。 網(wǎng)際協(xié)議 IP 是 TCP/IP 的心臟,也是網(wǎng)絡層中最重要的協(xié)議。 IP,全稱 Inter Protocol(因特網(wǎng)協(xié)議),它工作在網(wǎng)絡層,它負責將數(shù)據(jù)傳輸?shù)秸_的目的地,同時也負責路由。無論傳輸層使用何種協(xié)議,都要依賴 IP來發(fā)送和接收數(shù)據(jù)。 IP 提供一種無連接的傳輸機制,這就意味著在網(wǎng)絡傳輸?shù)拿總€數(shù)據(jù)報都作為獨立的單元來對待。 IP 并不維護服務器和客戶端之間的連接細節(jié),并且 IP 不能保證數(shù)據(jù)傳輸?shù)目煽啃浴H欢?,這些并不意味著分組將被毫無規(guī)則的忽略,而是僅在網(wǎng)絡出現(xiàn)故障時才會發(fā)生數(shù)據(jù)丟失。 IP 層接收由更低層(網(wǎng)絡接口層例如以太網(wǎng)設備驅(qū)動程序)發(fā)來的數(shù)據(jù)包,并把該數(shù)據(jù)包發(fā)送到更高層 TCP 或 UDP 層;相反, IP 層也把從 TCP 或 UDP基于 VC++ Socket 的多線程網(wǎng)絡聊天系統(tǒng)開發(fā)與設計 9 層接收來的數(shù)據(jù)包傳送到更低層。 IP 數(shù)據(jù)包是不可靠的,因為 IP 并沒有做任何事情來確認數(shù)據(jù)包是按順序發(fā)送的或者沒有被破壞。 IP 數(shù)據(jù)包中含有發(fā)送它的主機的地址(源地址)和接收 它的主機的地址(目的地址)。 如果 IP 數(shù)據(jù)包中有已經(jīng)封好的 TCP 數(shù)據(jù)包,那么 IP 將把它們向 ?上 ?傳送到TCP 層。 TCP 將包排序并進行錯誤檢查,同時實現(xiàn)虛電路間的連接。 TCP 數(shù)據(jù)包中包括序號和確認,所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。 UDP 與 TCP 位于同一層,但對于數(shù)據(jù)包的順序錯誤或重發(fā)。因此, UDP 不被應用于那些使用虛電路的面向連接的服務, UDP 主要用于那些面向查詢 應答的服務 。 TCP 和 UDP 服務通常有一個客戶 /服務器的關(guān)系 。 兩個系統(tǒng)間的多重連接是這樣 相互確認并協(xié)調(diào)一致 的, TCP 或 UDP 連接唯一地使用每個信息中的如下四項進行確認: 源 IP 地址 : 發(fā)送包的 IP 地址。 目的 IP 地址 : 接收包的 IP 地址。 源端口 : 源系統(tǒng)上的連接的端口。 目的端口 : 目的系統(tǒng)上的連接的端口。 端口是一個軟件結(jié)構(gòu),被客戶程序或服務進程用來發(fā)送和接收信息。一個端口對應一個 16 比特的數(shù)。服務進程通常使用一個固定的端口,例如, SMTP 使用 25。這些端口號是 確定 的,因為在建立與特定的主機或服務的連接時,需要這些地址和目的地址進行通訊。 C/S 模式(客戶機 /服務器模式) C/S 模式 是大家熟知的客戶
點擊復制文檔內(nèi)容
試題試卷相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1