中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

雅思真題有網(wǎng)站做嗎網(wǎng)絡(luò)培訓(xùn)機(jī)構(gòu)排名前十

雅思真題有網(wǎng)站做嗎,網(wǎng)絡(luò)培訓(xùn)機(jī)構(gòu)排名前十,阿里云主機(jī)建網(wǎng)站,做外貿(mào)網(wǎng)站推廣1.什么是IOCP IOCP(Input Output Completion Port)輸入輸出完成端口。其實(shí)就是基于重疊I/O的一種改進(jìn)的模型。 重疊I/O具有缺點(diǎn):重復(fù)調(diào)用非阻塞模式的accpet函數(shù)和以進(jìn)入alertablewait狀態(tài)為目的的SleepEx函數(shù)會(huì)影響程序性能。 而IOCP提供…

1.什么是IOCP

IOCP(Input Output Completion Port)輸入輸出完成端口。其實(shí)就是基于重疊I/O的一種改進(jìn)的模型。

重疊I/O具有缺點(diǎn):重復(fù)調(diào)用非阻塞模式的accpet函數(shù)和以進(jìn)入alertablewait狀態(tài)為目的的SleepEx函數(shù)會(huì)影響程序性能。

而IOCP提供的解決方案便是:讓主線程調(diào)用accept函數(shù),單獨(dú)創(chuàng)建至少一個(gè)線程來負(fù)責(zé)所有I/O的前后處理。

但請(qǐng)不要過分關(guān)注在線程上,主要還是如下問題:

??????? 1.I/O是否以非阻塞模式工作?

??????? 2.如何確定非阻塞模式的I/O是否完成?

2.分階段實(shí)現(xiàn)IOCP程序

2.1 實(shí)現(xiàn)原理

IOCP會(huì)將已完成的I/O信息注冊(cè)到CP對(duì)象(Completion Port完成端口),而我們就可以通過CP對(duì)象來獲取I/O是否完成的信息,所以有下面兩項(xiàng)工作:

  • 創(chuàng)建完成端口對(duì)象
  • 建立完成端口對(duì)象和套接字之間的聯(lián)系?

此時(shí)的套接字必須賦予重疊屬性。

2.2 創(chuàng)建CP對(duì)象

#include<windows.h>HANDLE CreateIoCompletionPort(
HANDLE fileHandle,                //創(chuàng)建CP對(duì)象時(shí)傳遞INVALID_HANDLE_VALUE
HANDLE ExistingCompletionPort,    //創(chuàng)建CP對(duì)象時(shí)傳遞NULL
ULONG_PTR CompletionKey,          //創(chuàng)建CP對(duì)象時(shí)傳遞0
DWORD NumberOfConcurrentThreads   //分配給CP對(duì)象的用于處理I/O的線程數(shù)。//例如:該參數(shù)為2時(shí),說明分配給CP對(duì)象的可以同時(shí)運(yùn)行的線程數(shù)最多為2個(gè)//如果為0時(shí),那么系統(tǒng)中CPU的個(gè)數(shù)就是可同時(shí)運(yùn)行的最大線程數(shù)
);
成功返回CP對(duì)象句柄
失敗返回NULL

2.3 創(chuàng)建和套接字連接完成的端口對(duì)象

#include<windows.h>HANDLE CreateIoCompletionPort(
HANDLE FileHandle,                //要連接到CP對(duì)象的套接字句柄
HANDLE ExistingCompletionPort,    //要連接套接字的CP對(duì)象句柄
ULONG_PTR CompletionKey,          //傳遞已完成I/O相關(guān)信息
DWORD NumberOfConcurrentThreads   //無論傳遞何值,只要第二個(gè)參數(shù)非NULL就會(huì)被忽略
);
成功返回CP對(duì)象句柄
失敗返回NULL

函數(shù)功能:將FileHandle句柄指向的套接字和ExistingCompletionPort指向的CP對(duì)象相連。

調(diào)用此函數(shù)后:只要針對(duì)FileHandle的I/O完成,相關(guān)信息就會(huì)注冊(cè)到ExistingCompletionPort里。

注意:第三個(gè)參數(shù)“傳遞已完成I/O相關(guān)信息”的意思是,你可以像重疊I/O里使用Complition routine來確認(rèn)I/O方式里把相關(guān)信息填寫到hEvent里的那樣,寫入其他信息,這樣當(dāng)I/O完成就可以獲取了。

2.4 確認(rèn)完成端口已完成的I/O和線程I/O處理

#include<windows.h>BOOL GetQueuedCompletionStatus(
HANDLE CompletionPort,        //注冊(cè)有已完成I/O信息的CP對(duì)象句柄
LPDWORD lpNumberOfBytes,      //保存I/O過程中傳輸?shù)臄?shù)據(jù)大小的變量地址值
PULONG_PTR lpCompletionKey,   //保存CreateIoCompleytionPort函數(shù)第三個(gè)參數(shù)值得變量地址值
LPOVERLAPPED* lpOverlapped,   //保存調(diào)用WSASend、WSARecv函數(shù)時(shí)傳遞的OVERLAPPED結(jié)構(gòu)體地址的變量地址值
DWORD dwMilliseconds          //超時(shí)信息,超過該指定時(shí)間后將返回FALSE并跳出函數(shù)。//傳遞INFINITE時(shí),程序?qū)⒆枞?#xff0c;直到已完成I/O信息寫入CP對(duì)象
);
成功返回TRUE
失敗返回FALSE

注意:

  • 調(diào)用此函數(shù)的線程數(shù)量不能超過CreateIoCompletionPort時(shí)指定的線程數(shù)。
  • 此函數(shù)并不知道當(dāng)前是輸入信息狀態(tài)還是輸出信息狀態(tài),需要自行判斷。

3. 實(shí)現(xiàn)IOCP模型的回聲服務(wù)器端

思路:每連接一個(gè)客戶端就創(chuàng)建一個(gè)線程,然后主線程里先接收一次數(shù)據(jù),在子線程里通過GetQueuedCompletionStatus函數(shù)阻塞住線程,判斷I/O狀態(tài),接著把接收的數(shù)據(jù)發(fā)送給客戶端,再次進(jìn)入接收狀態(tài),如此循環(huán)通信。

變量:

struct ClientInfo結(jié)構(gòu)體:存有套接字和套接字地址族信息,在CreateIoCompletionPort函數(shù)里,建立套接字和CP的連接的時(shí)候,當(dāng)做第三參數(shù)傳入

struct CPInfo結(jié)構(gòu)體:存有一個(gè)OVERLAPPED、WSABUF信息,以及還有一個(gè)int型用來判斷當(dāng)前是RECV還是SEND,在執(zhí)行WSARecv函數(shù)時(shí)當(dāng)做第六個(gè)參數(shù)進(jìn)行傳入。運(yùn)用下面的知識(shí)點(diǎn),所以可以在子線程執(zhí)行GetQueuedCompletionStatus函數(shù)時(shí),取得的第一個(gè)成員的地址,也就是這整個(gè)結(jié)構(gòu)體的地址。

知識(shí)點(diǎn):結(jié)構(gòu)體變量地址值與結(jié)構(gòu)體第一個(gè)成員的地址值相同。

struct CPInfo
{OVERLAPPED overlapped;WSABUF wsabuf;int mode;			//0:RECV 1:SEND
};
CPInfo data;
if(&data==&data.overlapped)
{std::cout<<"TRUE"<<std::endl;
}
else
{std::cout<<"FALSE"<<std::endl;
}
輸出TRUE
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<iostream>
#include<WinSock2.h>
#include<process.h>
#include<Windows.h>
#include<malloc.h>
#include<string>struct ClientInfo
{SOCKET socket;sockaddr_in socketAddr;
};struct CPInfo
{OVERLAPPED overlapped;WSABUF wsabuf;int mode;			//0:RECV 1:SEND
};unsigned WINAPI threadClient(void* arg);int main()
{WSADATA wsaData;if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData)){std::cout << "start up fail!" << std::endl;return 0;}SOCKET server = WSASocket(PF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);if (server == INVALID_SOCKET){std::cout << "socket fail!" << std::endl;return 0;}int mode = 1;ioctlsocket(server, FIONBIO, (u_long*)&mode);sockaddr_in serverAddr;memset(&serverAddr, 0, sizeof(serverAddr));serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);serverAddr.sin_port = htons(9130);if (SOCKET_ERROR == bind(server, (sockaddr*)&serverAddr, sizeof(serverAddr))){std::cout << "bind fail!" << std::endl;return 0;}if (SOCKET_ERROR == listen(server, 2)){std::cout << "listen fail!" << std::endl;return 0;}while (true){sockaddr_in clientAddr;memset(&clientAddr, 0, sizeof(clientAddr));int clientAddrLen = sizeof(clientAddr);SOCKET client = accept(server, (sockaddr*)&clientAddr, &clientAddrLen);if (client == SOCKET_ERROR){if (WSAGetLastError() == WSAEWOULDBLOCK)	//說明此時(shí)沒有客戶端連接{continue;}std::cout << "accept fail!" << std::endl;}else{HANDLE cpObject = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);if (cpObject == NULL){std::cout << "Create CP fail!" << std::endl;continue;}ClientInfo* clientinfo = new ClientInfo();clientinfo->socket = client;clientinfo->socketAddr = clientAddr;CreateIoCompletionPort((HANDLE)client, cpObject, (ULONG_PTR)clientinfo, 0);unsigned threadId;if (0 == _beginthreadex(NULL, 0, threadClient, (void*)&cpObject, 0, &threadId))	//創(chuàng)建一個(gè)線程{std::cout << "thread create fail!" << std::endl;continue;}CPInfo* cpinfo = new CPInfo();cpinfo->mode = 0;memset(&cpinfo->overlapped, 0, sizeof(cpinfo->overlapped));char buff[1024];cpinfo->wsabuf.buf = buff;cpinfo->wsabuf.len = sizeof(buff);DWORD readLen;DWORD flag = 0;WSARecv(client, &cpinfo->wsabuf, 1, &readLen, &flag, &cpinfo->overlapped, NULL);}}closesocket(server);WSACleanup();
}unsigned WINAPI threadClient(void* arg)
{HANDLE cpObject = *(HANDLE*)arg;CPInfo* cpinfo;ClientInfo* clientinfo;while (true){DWORD readLen;GetQueuedCompletionStatus(cpObject, &readLen, (PULONG_PTR)&clientinfo, (LPOVERLAPPED*)&cpinfo, INFINITE);if (readLen == 0){std::cout << "客戶端:" << inet_ntoa(clientinfo->socketAddr.sin_addr) << "斷開連接!" << std::endl;break;}if (cpinfo->mode == 0)		//recv{std::cout << "客戶端發(fā)來的消息:" << cpinfo->wsabuf.buf << std::endl;DWORD flag = 0;cpinfo->mode = 1;WSASend(clientinfo->socket, &cpinfo->wsabuf, 1, &readLen, flag, &cpinfo->overlapped, NULL);CPInfo* cpinfo2 = new CPInfo();cpinfo2->mode = 0;memset(&cpinfo2->overlapped, 0, sizeof(cpinfo2->overlapped));char buff[1024];cpinfo2->wsabuf.buf = buff;cpinfo2->wsabuf.len = sizeof(buff);DWORD readLen2;WSARecv(clientinfo->socket, &cpinfo2->wsabuf, 1, &readLen2, &flag, &cpinfo2->overlapped, NULL);}else						//send{delete cpinfo;}}CloseHandle(cpObject);closesocket(clientinfo->socket);return 0;
}
http://www.risenshineclean.com/news/64540.html

相關(guān)文章:

  • 網(wǎng)站開發(fā)注銷代碼搜索引擎營銷的常見方式
  • 常州做的網(wǎng)站的公司哪家好投稿平臺(tái)
  • 手機(jī)網(wǎng)站進(jìn)不去怎么辦推廣項(xiàng)目
  • 廣州外貿(mào)公司聯(lián)系方式刷seo關(guān)鍵詞排名軟件
  • 寧夏網(wǎng)站建設(shè)優(yōu)化蘭州網(wǎng)絡(luò)推廣優(yōu)化服務(wù)
  • 做賭博網(wǎng)站危險(xiǎn)嗎怎么弄一個(gè)自己的鏈接
  • 先用ps后用dw做網(wǎng)站私域流量營銷
  • 答題做任務(wù)網(wǎng)站查網(wǎng)站流量查詢工具
  • 龍崗沙灣社區(qū)網(wǎng)站建設(shè)邵陽網(wǎng)站seo
  • 浦東企業(yè)網(wǎng)站建設(shè)網(wǎng)盟推廣是什么意思
  • 做網(wǎng)站基本教程關(guān)鍵詞推廣seo
  • 重慶做網(wǎng)站有哪些seo泛目錄培訓(xùn)
  • 網(wǎng)站后臺(tái)管理頁面模板國際新聞網(wǎng)站
  • 1建設(shè)網(wǎng)站的重要性win7優(yōu)化工具
  • 怎樣做自己的小說網(wǎng)站外貿(mào)營銷型網(wǎng)站建設(shè)公司
  • 全面的網(wǎng)站建設(shè)免費(fèi)sem工具
  • 慈善系統(tǒng)網(wǎng)站建設(shè)需求網(wǎng)站建設(shè)教程
  • 快速學(xué)制作網(wǎng)站百度小說排行榜第一名
  • wordpress 導(dǎo)航站模板營銷型網(wǎng)站建設(shè)論文
  • 布偶貓網(wǎng)頁設(shè)計(jì)教程百度seo入駐
  • 注冊(cè)網(wǎng)站頁面跳轉(zhuǎn)錯(cuò)誤惠州seo排名優(yōu)化
  • 手機(jī)網(wǎng)站Com全國十大婚戀網(wǎng)站排名
  • 怎樣建立手機(jī)網(wǎng)站廣告營銷策略有哪些
  • 有自己域名如何做網(wǎng)站色盲測(cè)試圖第六版及答案大全
  • 微信上瀏覽自己做的網(wǎng)站免費(fèi)下載app并安裝
  • 做阿里還是網(wǎng)站濰坊百度關(guān)鍵詞優(yōu)化
  • 微商網(wǎng)站制作武漢關(guān)鍵詞排名推廣
  • 哪些網(wǎng)站可以找到做海報(bào)的素材鄭州seo網(wǎng)站排名
  • xxx網(wǎng)站策劃書西安網(wǎng)頁設(shè)計(jì)
  • 莫名接到網(wǎng)站建設(shè)電話推廣引流工具