#include <winsock2.h> #include <mswsock.h> #include <windows.h> #include <iostream> using namespace std; int g_ThreadCount; HANDLE g_hIOCP = INVALID_HANDLE_VALUE; SOCKET g_ServerSocket = INVALID_SOCKET; // Maximum Buffer Size #define MAX_BUFF_SIZE 8192 enum IO_OPERATION{IO_READ,IO_WRITE}; struct IO_DATA{ WSAOVERLAPPED Overlapped; char Buffer[MAX_BUFF_SIZE]; WSABUF wsabuf; int nTotalBytes; int nSentBytes; IO_OPERATION opCode; SOCKET activeSocket; }; DWORD WINAPI WorkerThread (LPVOID WorkThreadContext) { LPWSAOVERLAPPED lpOverlapped = NULL; IO_DATA *lpIOContext = NULL; WSABUF buffSend; DWORD dwRecvNumBytes = 0; DWORD dwSendNumBytes = 0; DWORD dwFlags = 0; DWORD dwIoSize = 0; BOOL bSuccess = FALSE; int nRet = 0; while( 1 ) { void * lpCompletionKey = NULL; bSuccess = GetQueuedCompletionStatus(g_hIOCP, &dwIoSize, (LPDWORD)&lpCompletionKey, (LPOVERLAPPED *)&lpOverlapped, INFINITE); if( !bSuccess ) { cout << "GetQueuedCompletionStatus() failed:"<<GetLastError()<<endl; break; } lpIOContext = (IO_DATA *)lpOverlapped; if(dwIoSize == 0) //socket closed? { cout << "Client disconnect" << endl; closesocket(lpIOContext->activeSocket); delete lpIOContext; continue; } if(lpIOContext->opCode == IO_READ) // a read operation complete { lpIOContext->nTotalBytes = lpIOContext->wsabuf.len; lpIOContext->nSentBytes = 0; lpIOContext->opCode = IO_WRITE; dwFlags = 0; nRet = WSASend( lpIOContext->activeSocket, &lpIOContext->wsabuf, 1, &dwSendNumBytes, dwFlags, &(lpIOContext->Overlapped), NULL); if( nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()) ) { cout << "WASSend Failed::Reason Code::"<< WSAGetLastError() << endl; closesocket(lpIOContext->activeSocket); delete lpIOContext; continue; } } else if(lpIOContext->opCode == IO_WRITE) //a write operation complete { lpIOContext->nSentBytes += dwIoSize; dwFlags = 0; if( lpIOContext->nSentBytes < lpIOContext->nTotalBytes ) { lpIOContext->opCode = IO_WRITE; // A Write operation has not completed yet, so post another // Write operation to post remaining data. buffSend.buf = lpIOContext->Buffer + lpIOContext->nSentBytes; buffSend.len = lpIOContext->nTotalBytes - lpIOContext->nSentBytes; nRet = WSASend ( lpIOContext->activeSocket, &buffSend, 1, &dwSendNumBytes, dwFlags, &(lpIOContext->Overlapped), NULL); if( nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()) ) { cout << "WASSend Failed::Reason Code::"<< WSAGetLastError() << endl; closesocket(lpIOContext->activeSocket); delete lpIOContext; continue; } } else { // Write operation completed, so post Read operation. lpIOContext->opCode = IO_READ; dwRecvNumBytes = 0; dwFlags = 0; lpIOContext->wsabuf.buf = lpIOContext->Buffer, ZeroMemory(lpIOContext->wsabuf.buf,MAX_BUFF_SIZE); lpIOContext->Overlapped.Internal = 0; lpIOContext->Overlapped.InternalHigh = 0; lpIOContext->Overlapped.Offset = 0; lpIOContext->Overlapped.OffsetHigh = 0; lpIOContext->Overlapped.hEvent = NULL; lpIOContext->wsabuf.len = MAX_BUFF_SIZE; nRet = WSARecv( lpIOContext->activeSocket, &lpIOContext->wsabuf, 1, &dwRecvNumBytes, &dwFlags, &lpIOContext->Overlapped, NULL); if( nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()) ) { cout << "WASRecv Failed::Reason Code::"<< WSAGetLastError() << endl; closesocket(lpIOContext->activeSocket); delete lpIOContext; continue; } } } } return 0; } void main (int argc, char * argv[]) { { // Init winsock2 WSADATA wsaData; ZeroMemory(&wsaData,sizeof(WSADATA)); int retVal = -1; if( (retVal = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0 ) { cout << "WSAStartup Failed::Reason Code::"<< retVal << endl; return; } } { //Create socket g_ServerSocket = WSASocket(AF_INET,SOCK_STREAM, IPPROTO_TCP, NULL,0,WSA_FLAG_OVERLAPPED); if( g_ServerSocket == INVALID_SOCKET ) { cout << "Server Socket Creation Failed::Reason Code::" << WSAGetLastError() << endl; return; } } { //bind sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.s_addr = htonl(INADDR_ANY); service.sin_port = htons(5000); int retVal = bind(g_ServerSocket,(SOCKADDR *)&service,sizeof(service)); if( retVal == SOCKET_ERROR ) { cout << "Server Soket Bind Failed::Reason Code::"<< WSAGetLastError() << endl; return; } } { //listen int retVal = listen(g_ServerSocket, 8); if( retVal == SOCKET_ERROR ) { cout << "Server Socket Listen Failed::Reason Code::"<< WSAGetLastError() << endl; return; } } { // Create IOCP SYSTEM_INFO sysInfo; ZeroMemory(&sysInfo,sizeof(SYSTEM_INFO)); GetSystemInfo(&sysInfo); g_ThreadCount = sysInfo.dwNumberOfProcessors * 1; g_hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,g_ThreadCount); if (g_hIOCP == NULL) { cout << "CreateIoCompletionPort() Failed::Reason::"<< GetLastError() << endl; return; } if (CreateIoCompletionPort((HANDLE)g_ServerSocket,g_hIOCP,0,0) == NULL){ cout << "Binding Server Socket to IO Completion Port Failed::Reason Code::"<< GetLastError() << endl; return ; } } { //Create worker threads for( DWORD dwThread=0; dwThread < g_ThreadCount; dwThread++ ) { HANDLE hThread; DWORD dwThreadId; hThread = CreateThread(NULL, 0, WorkerThread, 0, 0, &dwThreadId); CloseHandle(hThread); } } { //accept new connection while(1) { SOCKET ls = accept( g_ServerSocket, NULL, NULL ); if(ls == SOCKET_ERROR) break; cout << "Client connected." << endl; { //diable buffer to improve performance int nZero = 0; setsockopt(ls, SOL_SOCKET, SO_SNDBUF, (char *)&nZero, sizeof(nZero)); } if (CreateIoCompletionPort((HANDLE)ls,g_hIOCP,0,0) == NULL){ cout << "Binding Client Socket to IO Completion Port Failed::Reason Code::"<< GetLastError() << endl; closesocket(ls); } else { //post a recv request IO_DATA * data = new IO_DATA; ZeroMemory(&data->Overlapped,sizeof(data->Overlapped)); ZeroMemory(data->Buffer,sizeof(data->Buffer)); data->opCode = IO_READ; data->nTotalBytes = 0; data->nSentBytes = 0; data->wsabuf.buf = data->Buffer; data->wsabuf.len = sizeof(data->Buffer); data->activeSocket = ls; DWORD dwRecvNumBytes=0,dwFlags=0; int nRet = WSARecv(ls,&data->wsabuf, 1, &dwRecvNumBytes, &dwFlags, &data->Overlapped, NULL); if(nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError())){ cout << "WASRecv Failed::Reason Code::"<< WSAGetLastError() << endl; closesocket(ls); delete data; } } } } closesocket(g_ServerSocket); WSACleanup(); }
轉自:http://www.cppblog.com/sandy/archive/2007/06/06/25670.html
本文分享自華爲雲社區《GaussDB SQL基礎語法示例-BOOLEAN表達式》,作者:Gauss松鼠會小助手2。 一、前言 SQL是用於訪問和處理數據庫的標準計算機語言。GaussDB支持的SQL標準(默認支持SQL2、SQL3和SQL
背景 在 MySQL 中,當我們爲表創建了一個或多個索引後,通常需要在索引定義完成後,根據具體的數據情況執行 EXPLAIN 命令,才能觀察到數據庫實際使用哪個索引、是否使用索引。這使得我們在添加新索引之前,無法提前預知數據庫是否能使用期望
4月19日,Meta發佈了最新的大語言模型LLaMA3,具體包括一個 8B 模型和一個 70 B 模型,上下文長度支持8K, 被譽爲史上最強開源大語言模型,開源社區的“重磅炸彈”,效果直指GTP4。在諸多評測任務上,LLaMA3都有非常炸裂
MySQL 的鎖也是不少,在哪種情況下會連查詢都能被阻塞?這是一個有意思的問題。 工作中,很多開發和 DBA 可能接觸較多的鎖也就行鎖了。對於行鎖,阻塞寫能理解,阻塞讀實在是想不到。能阻塞讀的那肯定是顆粒度更大的鎖了,比如表級別的。 作者
4月19日,Meta發佈了最新的大語言模型LLaMA3,具體包括一個8B模型和一個70B模型,上下文長度支持8K,被譽爲史上最強開源大語言模型,開源社區的“重磅炸彈”,效果直指GTP4。在諸多評測任務上,LLaMA3都有非常炸裂的效果。8
作者:天彤 Atlassian 在 2020 年官方發佈公告,從 2021 年起停止 Jira Server 產品的銷售,並且在 2024 年徹底停止 Server 端產品的服務支持,這對於國內使用 Jira 產品的企業和研發團隊造成了不小
centos7 安裝 docker 安裝教程可參考:centos7 安裝 docker 開始安裝owncloud 1. 創建一個新的項目目錄 mkdir owncloud-docker-server cd owncloud-doc
MySQL 8.4 LTS 版本,我們一共修改了 20 個 InnoDB 變量的默認值。 作者:Frederic Descamps,EMEA 和亞太地區的 MySQL 社區經理。於 2016 年 5 月加入 MySQL 社區團隊。擔任開源
本文分享自華爲雲社區《華爲雲短信服務教你用Perl實現Smgp協議》,作者:張儉。 引言&協議概述 中國電信短消息網關協議(SMGP)是中國網通爲實現短信業務而制定的一種通信協議,全稱叫做Short Message Gateway Pro
一、架構圖**** 二、Nginx**** 用於做服務的反向代理。 三、網關**** PaaS平臺所有服務統一入口,包含token鑑權功能。 四、開放平臺**** 對第三方平臺開放的服務入口。 五、MQTT**** MQTT用於設備消息通
Impala目前支持Hadoop中幾種常見的文件格式 Parquet 、 ORC 、 Text 、 Avro 、 RCFile 和 SequenceFile 。下面簡要說明各種格式的使用、限制和一些注意事項。 不同的文件格式有着不同的適用場
Map是用於保存具有映射關係的數據集合,它具有雙列存儲的特點,即一次必須添加兩個元素,即一組鍵值對<Key,Value>,其中Key的值不可重複(當Key的值重複的時候,後面插入的對象會將之前插入的具有相同的Key值的對象覆蓋掉),Valu
前端面試題 - null是原始類型,但爲什麼typeof null的結果是object? 造成這個結果的原因是null的內存地址是以000開頭,而js會將000開頭的內存地址視爲object。 通過isNull()來判斷一個值是不是null
O2OA(翱途)開發平臺[下稱O2OA開發平臺或者O2OA]的消息機制允許開發者通過配置實現郵件通知。本篇主要闡述如何實現待辦消息的郵件通知。 一、先決條件: 1、O2Server服務器正常運行,系統安裝部署請參考
Flowable 有3種監聽器,相關內容在開發文檔中有詳細的說明: 事件監聽器(Flowable 開發文檔 3.18) 執行監聽器(Flowable 開發文檔 8.5.13) 任務監聽器(Flowable 開發文檔 8.5.14) 分別