日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

兩種I/O模式

一.選擇模型

二.異步選擇

三.事件選擇

四.重疊I/O模型

五.完成端口模型

五種I/O模型的比較




兩種I/O模式

1、兩種I/O模式

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

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


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


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

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

客戶端

#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] = '