當(dāng)前位置:首頁 > 芯聞號(hào) > 充電吧
[導(dǎo)讀]兩種I/O模式一.選擇模型二.異步選擇三.事件選擇四.重疊I/O模型五.完成端口模型五種I/O模型的比較兩種I/O模式1、兩種I/O模式阻塞模式:執(zhí)行I/O操作完成前會(huì)一直進(jìn)行等待,不會(huì)將控制權(quán)交給程

兩種I/O模式

一.選擇模型

二.異步選擇

三.事件選擇

四.重疊I/O模型

五.完成端口模型

五種I/O模型的比較




兩種I/O模式

1、兩種I/O模式

阻塞模式:執(zhí)行I/O操作完成前會(huì)一直進(jìn)行等待,不會(huì)將控制權(quán)交給程序。套接字默認(rèn)為阻塞模式??梢酝ㄟ^多線程技術(shù)進(jìn)行處理。

非阻塞模式:執(zhí)行I/O操作時(shí),Winsock函數(shù)會(huì)返回并交出控制權(quán)。這種模式使用起來比較復(fù)雜,因?yàn)楹瘮?shù)在沒有運(yùn)行完成就進(jìn)行返回,會(huì)不斷地返回WSAEWOULDBLOCK錯(cuò)誤。但功能強(qiáng)大。


如果你想在Windows平臺(tái)上構(gòu)建服務(wù)器應(yīng)用,那么I/O模型是你必須考慮的。Windows操作系統(tǒng)提供了選擇(Select)、異步選擇(WSAAsyncSelect)、事件選擇(WSAEventSelect)、重疊I/O(Overlapped I/O)和完成端口(Completion Port)共五種I/O模型。每一種模型均適用于一種特定的應(yīng)用場景。程序員應(yīng)該對(duì)自己的應(yīng)用需求非常明確,而且綜合考慮到程序的擴(kuò)展性和可移植性等因素,作出自己的選擇。


我會(huì)以一個(gè)回應(yīng)反射式服務(wù)器(與《Windows網(wǎng)絡(luò)編程》第八章一樣)來介紹這五種I/O模型。

我們假設(shè)客戶端的代碼如下(為代碼直觀,省去所有錯(cuò)誤檢查,以下同):

客戶端

#include

#include


#define SERVER_ADDRESS "137.117.2.148"

#define PORT 5150

#define MSGSIZE 1024


#pragma comment(lib, "ws2_32.lib")


int main()

{

WSADATA wsaData;

SOCKET sClient;

SOCKADDR_IN server;

char szMessage[MSGSIZE];

int ret;


// Initialize Windows socket library

WSAStartup(0x0202, &wsaData);


// Create client socket

sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);


// Connect to server

memset(&server, 0, sizeof(SOCKADDR_IN));

server.sin_family = AF_INET;

server.sin_addr.S_un.S_addr = inet_addr(SERVER_ADDRESS);

server.sin_port = htons(PORT);


connect(sClient, (struct sockaddr *)&server, sizeof(SOCKADDR_IN));


while (TRUE)

{

printf("Send:");

gets(szMessage);


// Send message

send(sClient, szMessage, strlen(szMessage), 0);


// Receive message

ret =recv(sClient, szMessage, MSGSIZE, 0);

szMessage[ret] = '