Socket模型詳解(轉(zhuǎ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] = '