Created
September 7, 2022 05:23
-
-
Save mwpcheung/8177b3c56ab26df281139f0e2eeae583 to your computer and use it in GitHub Desktop.
iocp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
using namespace std; | |
#define WIN32_LEAN_AND_MEAN | |
#include <windows.h> | |
#include <Winsock2.h> | |
#pragma comment(lib, "Ws2_32.lib") | |
void InitWs2(); | |
void UninitWs32(); | |
int main() | |
{ | |
InitWs2(); | |
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); | |
if (sockClient == SOCKET_ERROR) | |
{ | |
printf("socket 创建失败\r\n"); | |
return 0; | |
} | |
else | |
{ | |
printf("socket 创建成功\r\n"); | |
} | |
sockaddr_in si; | |
si.sin_family = AF_INET; | |
si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); | |
si.sin_port = htons(9527); | |
int nRet = connect(sockClient, (sockaddr*)&si, sizeof(si)); | |
if (nRet == SOCKET_ERROR) | |
{ | |
printf("连接服务器失败 \r\n"); | |
return 0; | |
} | |
else | |
{ | |
printf("连接服务器成功 \r\n"); | |
} | |
while (true) | |
{ | |
char szBuff[MAXBYTE] = { 0 }; | |
std::cin >> szBuff; | |
nRet = send(sockClient, szBuff, sizeof(szBuff), 0); | |
if (nRet == SOCKET_ERROR) | |
{ | |
printf("发送失败\r\n"); | |
} | |
else | |
{ | |
printf("发送成功 \r\n"); | |
} | |
} | |
} | |
void InitWs2() | |
{ | |
WORD wVersionRequested; | |
WSADATA wsaData; | |
int err; | |
wVersionRequested = MAKEWORD(2, 2); | |
err = WSAStartup(wVersionRequested, &wsaData); | |
if (err != 0) { | |
return; | |
} | |
if (LOBYTE(wsaData.wVersion) != 2 || | |
HIBYTE(wsaData.wVersion) != 2) { | |
WSACleanup(); | |
return; | |
} | |
} | |
void UninitWs32() | |
{ | |
WSACleanup(); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
using namespace std; | |
#define FD_SETSIZE 128 | |
#define WIN32_LEAN_AND_MEAN | |
#include <windows.h> | |
#include <Winsock2.h> | |
#pragma comment(lib, "Ws2_32.lib") | |
#include <Mswsock.h> | |
#pragma comment(lib, "Mswsock.lib") | |
void InitWs2(); | |
void UninitWs32(); | |
void PostAccept(SOCKET sockListen, HANDLE hIocp); | |
void PostRecv(SOCKET sock); | |
enum IO_EVENT | |
{ | |
IO_ACCEPT, | |
IO_RECV, | |
IO_SEND | |
}; | |
struct MYOV :public OVERLAPPED | |
{ | |
MYOV(SOCKET sock, IO_EVENT event) | |
{ | |
memset(this, 0, sizeof(MYOV)); | |
m_sockClient = sock; | |
m_buf.buf = m_btBuf; | |
m_buf.len = sizeof(m_btBuf); | |
m_dwBytesRecved = 0; | |
m_dwFlag = 0; | |
m_event = event; | |
} | |
IO_EVENT m_event; | |
SOCKET m_sockClient; | |
WSABUF m_buf; | |
CHAR m_btBuf[MAXBYTE]; | |
DWORD m_dwBytesRecved; | |
DWORD m_dwFlag; | |
}; | |
int main() | |
{ | |
InitWs2(); | |
SOCKET sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); | |
if (sockServer == SOCKET_ERROR) | |
{ | |
printf("socket 创建失败\r\n"); | |
return 0; | |
} | |
else | |
{ | |
printf("socket 创建成功\r\n"); | |
} | |
//2) | |
sockaddr_in si; | |
si.sin_family = AF_INET; | |
si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); | |
si.sin_port = htons(9527); | |
int nRet = bind(sockServer, (sockaddr*)&si, sizeof(si)); | |
if (nRet == SOCKET_ERROR) | |
{ | |
printf("绑定端口失败\r\n"); | |
return 0; | |
} | |
else | |
{ | |
printf("绑定端口成功\r\n"); | |
} | |
//3) | |
nRet = listen(sockServer, SOMAXCONN); | |
if (nRet == SOCKET_ERROR) | |
{ | |
printf("监听失败 \r\n"); | |
return 0; | |
} | |
else | |
{ | |
printf("监听成功 \r\n"); | |
} | |
//1)创建IOCP对象 | |
ULONG uKey = 0; | |
HANDLE hIocp = CreateIoCompletionPort( | |
INVALID_HANDLE_VALUE, | |
NULL, | |
NULL, | |
0); | |
//2) 关联IOCP和socket对象 | |
HANDLE bRet=CreateIoCompletionPort( | |
(HANDLE)sockServer, | |
hIocp, | |
NULL, | |
0); | |
//3)投递一个接收连接的请求 | |
PostAccept(sockServer,hIocp); | |
//遍历队列 | |
while (true) | |
{ | |
DWORD dwBytesTranfered = 0; | |
ULONG_PTR uKey; | |
LPOVERLAPPED pOv = NULL; | |
GetQueuedCompletionStatus( | |
hIocp, | |
&dwBytesTranfered, | |
&uKey, | |
&pOv, | |
INFINITE | |
); | |
MYOV* pov = (MYOV*)pOv; | |
switch (pov->m_event) | |
{ | |
//接收新的连接 | |
case IO_ACCEPT: | |
//连接完成后,再次投递一个连接的请求 | |
PostAccept(sockServer, hIocp); | |
cout << " 有新的连接接入" << endl; | |
PostRecv(pov->m_sockClient); | |
break; | |
case IO_RECV: | |
//投递一个接收数据的请求 | |
printf("接收到数据%s\r\n", pov->m_btBuf); | |
PostRecv(pov->m_sockClient); | |
break; | |
default: | |
break; | |
} | |
if (pov != NULL){ | |
delete pov; | |
} | |
} | |
} | |
void PostRecv(SOCKET sock) | |
{ | |
//接收数据的请求 | |
MYOV* pOv = new MYOV(sock, IO_RECV); | |
int nRet = WSARecv( | |
sock, | |
&pOv->m_buf, 1, | |
&pOv->m_dwBytesRecved, | |
&pOv->m_dwFlag, | |
pOv, | |
NULL); | |
} | |
void PostAccept(SOCKET sockListen,HANDLE hIocp) | |
{ | |
//接收连接的请求 | |
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); | |
HANDLE hRet = CreateIoCompletionPort( | |
(HANDLE)sockClient, | |
hIocp, | |
NULL, | |
0); | |
char szBuff[MAXBYTE] = { 0 }; | |
DWORD dwRecved = 0; | |
MYOV* pOv = new MYOV(sockClient, IO_ACCEPT); | |
AcceptEx( | |
sockListen, | |
sockClient, | |
szBuff, | |
0, | |
sizeof(sockaddr) + 16, | |
sizeof(sockaddr) + 16, | |
&dwRecved, | |
pOv | |
); | |
} | |
void InitWs2() | |
{ | |
WORD wVersionRequested; | |
WSADATA wsaData; | |
int err; | |
wVersionRequested = MAKEWORD(2, 2); | |
err = WSAStartup(wVersionRequested, &wsaData); | |
if (err != 0) { | |
return; | |
} | |
if (LOBYTE(wsaData.wVersion) != 2 || | |
HIBYTE(wsaData.wVersion) != 2) { | |
WSACleanup(); | |
return; | |
} | |
} | |
void UninitWs32() | |
{ | |
WSACleanup(); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment