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

正文內(nèi)容

基于局域網(wǎng)的聊天程序設(shè)計(編輯修改稿)

2025-01-11 01:14 本頁面
 

【文章內(nèi)容簡介】 關(guān)閉 Socket。 具體流程圖如 1 所示。 首先在服務(wù)器方,利用 socket()函數(shù)建立流式套接字,返回套接字號 s,接著利用 bind()函數(shù)將套接字 s與本地地址綁定,緊接著利用 listen(0 函數(shù)通知TCP,監(jiān)聽客戶方,服務(wù)器準備接收連接,沒有連接的話,服務(wù)器方通過closesocket()關(guān)閉套接字 s,服務(wù)結(jié)束。有連接的話 , 在客戶方,通過 socket()函數(shù)建立流式套接字 s,此時在服務(wù)器方,建立連接,通過 accept()返回,得到新的套接字 ns,客戶方通過 connect()將套接字 s與遠程地址連接 ,此時服務(wù) 器方/客戶方在 ns/s 上讀 /寫數(shù)據(jù),直到交換完成。交換完成后,服務(wù)器方 /客戶方關(guān)閉套接字 ns/s,最后服務(wù)器方通過 closesocket()關(guān)閉最初套接字 s,服務(wù)結(jié)束。 具體設(shè)計過程如圖 1所示,具體設(shè)計代碼將會在下面介紹: 圖 1 面向連接的套接字的系統(tǒng)調(diào)用 流程 圖 服務(wù)器方 Socket()建立流式接字,返回套接字號 s 客戶方 bind()套接字 s 與本地地址綁定 listen()通知 TCP 服務(wù)器準備接收連接 accept()接收連 接,等待客戶端的連接 建立連接, accept()返回,得到新套接 ns Recv()/send()在 ns上讀 /寫數(shù)據(jù),直到完成交換 closesocket(),關(guān)閉套接字 ns closesocket()關(guān)閉最初套接字 s,服務(wù)結(jié)束 Socket()建立流式套接字號 s connect()將套接字 s與遠程地址連接 Recv()/send()在 s 上讀 /寫數(shù)據(jù),直到完成交換 closesocket()關(guān)閉套接字 s,結(jié)束 TCP 程序 設(shè)計核心代碼分析 通信設(shè)計代碼分析 先分析服務(wù)器端。 首先定義初始化網(wǎng)絡(luò)函數(shù),也就是 WINDOWS SOCKETS 的啟動 在所有 WINDOWS SOCKETS 函數(shù)中,只有啟動函數(shù) WSAStartup() 和終止函數(shù) WSACleanup() 是必須使用的。 啟動函數(shù)必須是第一個使用的函數(shù),而且它允許指定 WINDOWS SOCKETS API 的版本,并獲得 SOCKETS 的特定的一些技術(shù)細節(jié)。本結(jié)構(gòu)如下: int PASCAL FAR WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData)。 其中 wVersionRequested 保證 SOCKETS 可正常運行的 DLL 版本,如果不支持,則返回錯誤信息。 設(shè)計代碼如下,主要是進行 WSAStartup()函數(shù) 的調(diào)用 WORD wVersionRequested。// 定義版本信息變量 WSADATA wsaData。//定義數(shù)據(jù)信息變量 int err。//定義錯誤號變量 wVersionRequested = MAKEWORD(1,1)。//給版本信息賦值 err = WSAStartup(wVersionRequested, amp。wsaData)。//給錯誤信息賦值 if(err!=0) { return。//告訴用戶找不到合適的版本 } //確認 WINDOWS SOCKETS DLL 支持 版本 //DLL 版本可以高于 //系統(tǒng)返回的版本號始終是最低要求的 ,即應(yīng)用程序與 DLL 中可支持的最低版本號 if(LOBYTE()!= 1|| HIBYTE()!=1) { WSACleanup()。//告訴用戶找不到合適的版本 return。 } //WINDOWS SOCKETS DLL 被進程接受,可以進入下一步操作 既然啟動了到最后就需要調(diào)用 WSACleanup()函數(shù)來終止 , 關(guān)閉函數(shù)使用時,任何打開并已連接的 SOCK_STREAM 套接字被復(fù)位,但那些已由 closesocket() 函數(shù)關(guān)閉的但仍有未發(fā)送數(shù)據(jù)的套接字不受影響,未發(fā)送的數(shù)據(jù)仍將被發(fā)送。程序運行時可能會多次調(diào)用 WSAStartuo() 函數(shù),但必須保證每次調(diào)用時的 wVersionRequested 的值是相同的。 接著是 創(chuàng)建服務(wù)器端套接字 ,主要代碼如下: SOCKET ServerSock。 //服務(wù)器端 Socket ServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)。 if(ServerSock == INVALID_SOCKET) { MessageBox(創(chuàng)建套接字失敗 !)。 closesocket(ServerSock)。 WSACleanup()。 return FALSE。 } 套接字創(chuàng)建好之后就是與本地地址綁定: sockaddr_in localaddr。 = AF_INET。 = htons(8888)。 = 0。 if(bind(ServerSock ,(struct sockaddr*)amp。localaddr,sizeof(sockaddr)) = = SOCKET_ERROR) { MessageBox(綁定地址失敗 !)。 closesocket(ServerSock)。 WSACleanup()。 return FALSE。 } 接下來就是對 SOCKET 的設(shè)置,本程序使用的數(shù)據(jù)傳輸模式是異步非阻塞模式,設(shè)置好之后就是監(jiān)聽客戶端信息,主要代碼如下 if(WSAAsyncSelect(ServerSock, m_hWnd, NETWORK_EVENT, FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE) == SOCKET_ERROR) { MessageBox(注冊網(wǎng)絡(luò)異步事件失敗 !)。 WSACleanup()。 return FALSE。 } listen(ServerSock, 5)。 //設(shè)置偵聽模式 return TRUE。 } 其中 m_hWnd 為應(yīng)用程序的主對話框或主窗口的句柄 。 這就要說到網(wǎng)絡(luò)異步函數(shù)的回調(diào)函數(shù),主要代碼內(nèi)容如下: OnNetEvent(WPARAM wParam, LPARAM lParam){ //調(diào)用 Winsock API 函數(shù),得到網(wǎng)絡(luò)事件類型 int iEvent = WSAGETSELECTEVENT(lParam)。 //調(diào)用 Winsock API 函數(shù),得到發(fā)生此事件的客戶端套接字 SOCKET CurSock= (SOCKET)wParam。 switch(iEvent) { case FD_ACCEPT: //客戶端連接請求事件 OnAccept(CurSock)。 break。 case FD_CLOSE: //客戶端斷開事件 : OnClose(CurSock)。 break。 case FD_READ: //網(wǎng)絡(luò)數(shù)據(jù)包到達事件 OnReceive(CurSock)。 break。 case FD_WRITE: //發(fā)送網(wǎng)絡(luò)數(shù)據(jù)事件 OnSend(CurSock)。 break。 default: break。 }} 另外, 發(fā)生在相應(yīng) Socket 上的各種網(wǎng)絡(luò)異步事件的處理函數(shù),其中 OnAccept傳進來的參數(shù)是服務(wù)器端創(chuàng)建的套接字, OnClose()、 OnReceive()和 OnSend()傳進來的參數(shù)均是服務(wù)器端在接受客戶端連接時新創(chuàng)建的用與此客戶端通信的Socket。 定義 OnAccept()函數(shù)來 接受連接請求,并保存與發(fā)起連接請求的客戶端進行通信 Socket, 為新的 socket 注冊異步事件 。定義 OnSend()函 數(shù)來 給客戶端發(fā)數(shù)據(jù)時做相關(guān)預(yù)處理 。 定義 OnReceive()函數(shù)來 讀出網(wǎng)絡(luò)緩沖區(qū)中的數(shù)據(jù)包 。定義 OnClose()函數(shù)來 結(jié)束與相應(yīng)的客戶端的通信,釋放相應(yīng)資源 。 接下來講講客戶端方。 首先初始化網(wǎng)絡(luò)部分,帶不需要將套接字設(shè)置為監(jiān)聽模式。注冊異步事件時,沒有 FD_ACCEPT,但增加了 FD_CONNECT 事件,因此沒有 OnAccept()函數(shù),但增加了 OnConnect()函數(shù)。向服務(wù)器發(fā)出連接請求時,使用 connect()函數(shù),連接成功后,會響應(yīng)到 OnConnect()函數(shù)中。下面是 OnConnect()函數(shù)的定義,傳進來的參數(shù)是客戶端 Socket 和服務(wù)器端發(fā)回來的連接是否成功的標志。 void CXFClientDlg::OnConnect(SOCKET CurSock, int error) { if(0 = = error) { if(CurSock = = ClntSock) MessageBox(連接服務(wù)器成功 !)。 } } 另外定義 OnReceive()函數(shù)來處理網(wǎng)絡(luò)數(shù)據(jù)到達事件 。定義 OnSend()函數(shù)來處理發(fā)送網(wǎng)絡(luò)數(shù)據(jù)事件 。定義 OnClose()函數(shù)來處理服務(wù)器的關(guān)閉事件。 數(shù)據(jù)傳輸代碼分析 在服務(wù)器方用 WSASend()函數(shù)來發(fā)送數(shù)據(jù),使用 WSARecv()來接收數(shù)據(jù)。Windows Sockets 不鼓勵用戶使用阻塞方式傳輸數(shù)據(jù),因為那樣可能會阻塞整個 Windows 環(huán)境。發(fā)送數(shù)據(jù)主要代碼如下所示: if (WSASend(pSIs, amp。(pSIwsaBuf), 1,amp。dwSendBytes, 0,amp。(pSIo), NULL) == SOCKET_ERROR) { if (WSAGetLastError() != ERROR_IO_PENDING) { PrintSystemError(WSASend()失敗 )。//自定義出錯顯示函數(shù) return 1。 }} 其中 pSI 的類型是自定義的網(wǎng)絡(luò)信息結(jié)構(gòu),包含網(wǎng)絡(luò)的所有信息。結(jié)構(gòu)定義如下: typedef struct { char buffRecv[DATA_BUFSIZE]。 char buffSend[DATA_
點擊復(fù)制文檔內(nèi)容
研究報告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1