主流I/O模型總結

異步通知I/O模型(Windows)

#include<string.h>
#include<stdio.h>
#include<WinSock2.h>
#define BUF_SIZE 100
void CompressSockets(SOCKET hSockArr[], int idx, int total);
void CompressEvent(WSAEVENT hEventArr[], int idx, int total);
char msg[BUF_SIZE];//緩沖區
int main(int argc,char* argv[])
{WSADATA wsaData;//初始化網絡if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){printf("WSAStartup error!\n");return -1;}SOCKET hServSock, hClentSock;//服務器客戶端套接字SOCKADDR_IN servAdr, clntAdr;//服務器客戶端地址SOCKET hSockArr[WSA_MAXIMUM_WAIT_EVENTS];//套接字數組WSAEVENT hEventArr[WSA_MAXIMUM_WAIT_EVENTS];//句柄數組int numOfClntSock = 0;//套接字數量WSAEVENT newEvent;//事件對象//初始化服務器套接字hServSock = socket(PF_INET, SOCK_STREAM, 0);memset(&servAdr, 0, sizeof(servAdr));servAdr.sin_family = AF_INET;servAdr.sin_addr.s_addr = htonl(INADDR_ANY);servAdr.sin_port = ntohs(atoi(argv[1]));if (bind(hServSock, (SOCKADDR*)&servAdr, sizeof(servAdr)) == SOCKET_ERROR){printf("bind error!\n");return -2;}if (listen(hServSock, 5) == SOCKET_ERROR){printf("listen error!\n");return -3;}newEvent = WSACreateEvent();//創建一個事件對象if (WSAEventSelect(hServSock, newEvent, FD_ACCEPT) == SOCKET_ERROR)//連接事件對象的套接字 套接字發生FD_ACCEPT事件,newEvent內核對象改變為signaled狀態{printf("listen error!\n");return -4;}hSockArr[numOfClntSock] = hServSock;//加入套接字hEventArr[numOfClntSock] = newEvent;//加入句柄numOfClntSock++;//開始監聽事件while (1){int posInfo, StartIdx;//StartIdx = posInfo-WSA_WAIT_EVENT_0; 轉變為signaled狀態的事件對象最小句柄索引posInfo = WSAWaitForMultipleEvents(numOfClntSock, hEventArr, FALSE, WSA_INFINITE, FALSE);//等待一個事件發生StartIdx = posInfo - WSA_WAIT_EVENT_0; //轉變為signaled狀態的事件對象的最小句柄的索引for (int i = StartIdx; i < numOfClntSock; i++){int sigEventIdx = WSAWaitForMultipleEvents(1, &hEventArr[i], TRUE, 0, FALSE);//遍歷其他每個事件對象(非阻塞)if (sigEventIdx == WSA_WAIT_FAILED || sigEventIdx == WSA_WAIT_TIMEOUT)//i對應內核對象沒有發生事件{continue;}else//i內核對象發生了事件{WSANETWORKEVENTS netEvents;//保存事件類型和錯誤信息sigEventIdx = i;WSAEnumNetworkEvents(hSockArr[sigEventIdx], hEventArr[sigEventIdx], &netEvents);//區分事件類型if (netEvents.lNetworkEvents & FD_ACCEPT)//連接事件{if (netEvents.iErrorCode[FD_ACCEPT_BIT])//錯誤{printf("Accept Error!\n");return -5;}int clntAdrLen = sizeof(clntAdr);//客戶端地址長度hClentSock = accept(hSockArr[sigEventIdx], (SOCKADDR*)&clntAdr, &clntAdrLen);//接收連接newEvent = WSACreateEvent();//創建新內核事件對象WSAEventSelect(hClentSock, newEvent, FD_READ | FD_CLOSE);//連接事件對象的套接hEventArr[numOfClntSock] = newEvent;hSockArr[numOfClntSock] = hClentSock;numOfClntSock++;printf("connected new client...");}if (netEvents.lNetworkEvents & FD_READ)//通信事件{if (netEvents.iErrorCode[FD_READ_BIT] != 0){printf("read error");return -6;}int strLen = recv(hSockArr[sigEventIdx], msg, sizeof(msg), 0);send(hSockArr[sigEventIdx], msg, strLen, 0);}if (netEvents.lNetworkEvents & FD_CLOSE)//斷開連接事件{if (netEvents.iErrorCode[FD_CLOSE_BIT] != 0){printf("Close Error");break;}//關閉套接字和事件對象WSACloseEvent(hEventArr[sigEventIdx]);closesocket(hSockArr[sigEventIdx]);//調整套接字數組和事件數組平衡numOfClntSock--;CompressEvent(hEventArr, sigEventIdx, numOfClntSock);CompressSockets(hSockArr, sigEventIdx, numOfClntSock);}}}}WSACleanup();return 0;
}void CompressSockets(SOCKET hSockArr[], int idx, int total)
{for (int i=idx; i < total; i++){hSockArr[i] = hSockArr[i + 1];}
}
void CompressEvent(WSAEVENT hEventArr[], int idx, int total)
{for (int i=idx; i < total; i++){hEventArr[i] = hEventArr[i + 1];}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42130.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42130.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42130.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

奇景光電戰略投資Obsidian,共筑熱成像技術新未來

5月29日,業界領先的IC設計公司奇景光電宣布,將對熱成像傳感器解決方案制造商Obsidian進行戰略性投資,并以主要投資者的身份,參與到Obsidian的可轉換票據融資活動中。雖然奇景光電并未公開具體的投資金額,但這一舉動無疑向市場傳遞了一個明確的信號:奇景光電對Obsidian的技…

【INTEL(ALTERA)】為什么我會看到包含管道橋的Nios II設計出現 Flash Programmer 問題?

目錄 說明 解決方法 說明 簡化地址解碼的常見解決方案是將連接到Avalon管道橋后Nios II處理器的數據主的外設放置&#xff0c;有時可能包括一些內存 IP&#xff0c;如片上 RAM。 但是&#xff0c;如果預期內存包含Nios II程序代碼&#xff0c;則應該以與Nios II指令主連接到…

10、matlab中字符、數字、矩陣、字符串和元胞合并為字符串并將字符串以不同格式寫入讀出excel

1、前言 在 MATLAB 中&#xff0c;可以使用不同的數據類型&#xff08;字符、數字、矩陣、字符串和元胞&#xff09;合并為字符串&#xff0c;然后將字符串以不同格式寫入 Excel 文件。 以下是一個示例代碼&#xff0c;展示如何將不同數據類型合并為字符串&#xff0c;并以不…

【Mindspore進階】-03.ShuffleNet實戰

ShuffleNet圖像分類 當前案例不支持在GPU設備上靜態圖模式運行&#xff0c;其他模式運行皆支持。 ShuffleNet網絡介紹 ShuffleNetV1是曠視科技提出的一種計算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一樣主要應用在移動端&#xff0c;所以模型的設計目標就是利用有…

如何在Java中實現自動化測試和集成測試

如何在Java中實現自動化測試和集成測試 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 自動化測試和集成測試是現代軟件開發過程中至關重要的環節。Java作為一…

分享實現地鐵車輛側面圖

簡介 通過偽類和關鍵幀動畫實現地鐵車輛側面圖 在線演示 偽元素和關鍵幀動畫 實現代碼 <!DOCTYPE html><html><head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <meta http-equiv"X-UA-Co…

設計模式之單例模式(Java)

單例模式實現方式&#xff1a;懶漢式、餓漢式、雙重檢查、枚舉、靜態內部類&#xff1b; 懶漢式&#xff1a; /*** 懶漢式單例模式* author: 小手WA涼* create: 2024-07-06*/ public class LazySingleton implements Serializable {private static LazySingleton lazySinglet…

對BSV區塊鏈的曼達拉網絡通俗易懂的解釋

??發表時間&#xff1a;2023年6月15日 BSV區塊鏈正在引入“曼達拉”升級&#xff0c;使BSV區塊鏈網絡的拓撲結構能夠適配Teranode&#xff0c;適配這個可以大幅擴容的節點軟件。BSV區塊鏈上曼達拉網絡的概念并不會改變整個系統的核心規則&#xff1b;相反&#xff0c;它能夠引…

為什么https比http更安全

讀完本文&#xff0c;希望你能明白&#xff1a; HTTP通信存在什么問題HTTPS如何改進HTTP存在那些問題HTTPS工作原理是什么 一、什么是HTTPS HTTPS是在HTTP上建立SSL加密層&#xff0c;并對傳輸數據進行加密&#xff0c;是HTTP協議的安全版。現在它被廣泛用于萬維網上安全敏感…

【qt】如何獲取本機的IP地址?

需要用到這個類QHostInfo和pro里面添加network模塊 用這個類的靜態函數forName()來獲取該主機名的信息 返回的就是這個類 這個QHostInfo類就包括主機的IP地址信息 用靜態函數addresses()來獲取 返回的是一個QHostAddress的容器 QList<QHostAddress>addrList hostIn…

Laravel隊列機制深度解析:異步任務處理的高效之道

Laravel隊列機制深度解析&#xff1a;異步任務處理的高效之道 Laravel的隊列系統是一個強大的工具&#xff0c;用于執行后臺任務和異步處理。它允許開發者將耗時的任務&#xff0c;如發送郵件、處理圖片等&#xff0c;放入隊列中&#xff0c;然后由后臺工作進程異步執行。本文…

Docker 鏡像移動或復制到另一臺服務器

在實際的開發和部署過程中&#xff0c;我們可能需要將 Docker 鏡像從一臺服務器移動或復制到另一臺服務器。本文將詳細介紹如何實現這一操作&#xff0c;幫助你更好地管理和遷移 Docker 鏡像。 一、使用 docker save 和 docker load 命令 docker save 和 docker load 是 Dock…

課題申報書中要用的思路圖(技術路線圖)30張,超高清!

最近在弄課題申報書的時候&#xff0c;需要畫“技術路線圖”&#xff1b;和小伙伴們探討才發現很多人居然不會畫這種圖&#xff0c;還有很多人在Word里面一點一點拼湊…… 我給大家收集了網上非常熱門的30張“技術路線圖”&#xff0c;但網上流傳的都太模糊了&#xff0c;想看…

KBPC3506-ASEMI儲能專用整流橋KBPC3506

編輯&#xff1a;ll KBPC3506-ASEMI儲能專用整流橋KBPC3506 型號&#xff1a;KBPC3506 品牌&#xff1a;ASEMI 封裝&#xff1a;KBPC-4 正向電流&#xff08;Id&#xff09;&#xff1a;35A 反向耐壓&#xff08;VRRM&#xff09;&#xff1a;600V 正向浪涌電流&#xf…

基于RK3588的8路攝像頭實時全景拼接

基于RK3588的8路攝像頭實時全景拼接 輸入&#xff1a;2路csi轉8路mpi的ahd攝像頭&#xff0c;分辨率1920 * 1080 8路拼接結果&#xff1a; 6路拼接結果&#xff1a; UI界面&#xff1a; UI節目設計原理

SpringBoot新手快速入門系列教程一:window上編程環境安裝和配置

首先編譯器&#xff0c;建議各位不要去嘗試AndroidStudio和VisualStudio來做SpringBoot項目。乖乖的直接下載最新版即可 https://www.jetbrains.com.cn/idea/ 當然這是一個收費的IDE&#xff0c;想要便宜可以想辦法去某寶買授權&#xff0c;僅供學習參考用&#xff01;賺了錢…

Spring Boot中的多租戶架構實現

Spring Boot中的多租戶架構實現 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 一、引言 隨著云計算和SaaS&#xff08;軟件即服務&#xff09;模式的流行&a…

Matlab中collectPlaneWave函數的應用

查看文檔如下&#xff1a; 可以看出最多5個參數&#xff0c;分別是陣列對象&#xff0c;信號幅度&#xff0c;入射角度&#xff0c;信號頻率&#xff0c;光速。 在下面的代碼中&#xff0c;我們先創建一個3陣元的陣列&#xff0c;位置為&#xff1a;&#xff08;-1,0,0&#x…

52-3 權限維持 - IFEO注入(鏡像劫持)

IFEO注入(映像劫持)介紹 IFEO(Image File Execution Options)位于Windows注冊表中的路徑為: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options IFEO最初設計用于為在默認系統環境下可能出現錯誤的程序提供特殊的調試和執…

MySQL 常見錯誤及解決方案

1. Too many connections 運行環境&#xff1a;Winows11、Phpstudy V8.1.1.3、MySQL 5.7.26 同一時間 MySQL 的連接數量有限制&#xff0c;當超過上限時將提示下面錯誤信息&#xff1a; 1040 - Too many connections 查看當前最大連接數 mysql> show variables like %max_…