Skip to content

Instantly share code, notes, and snippets.

@mwpcheung
Created September 7, 2022 05:23
Show Gist options
  • Save mwpcheung/8177b3c56ab26df281139f0e2eeae583 to your computer and use it in GitHub Desktop.
Save mwpcheung/8177b3c56ab26df281139f0e2eeae583 to your computer and use it in GitHub Desktop.
iocp
#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();
}
#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