#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib ")
#define READ 0
#define WRITE 1
#define BUFFSIZE 4000
char *szTitle = "Test";
char *szWindowClass = "Test";
HINSTANCE hInst;
HANDLE hIocp;
SOCKET sListen;
SOCKADDR_IN InternetAddr;
HWND hWnd, hBtn_Start, hBtn_Stop, hBtn_Test, hEdit, hCombox;
BOOL bRun;
//typedef struct _PER_IO_OPERATION_DATA
//{
// OVERLAPPED Overlapped; //Overlapped结构
// WSABUF DataBuff; //用于存放接收数据
// char Buff[24];
// unsigned long recvBytes; //存储接收到的字节数
// SOCKADDR_IN remoteAddr; //存储数据来源IP地址
// int remoteAddrLen; //存储数据来源IP地址长度
//}PER_IO_OPERATION_DATA, *LPPER_IO_OPERATION_DATA;
typedef struct _PER_IO_OPERATION_DATA
{
OVERLAPPED Overlapped; //Overlapped结构
WSABUF DataBuff; //用于存放接收数据
CHAR buffer[BUFFSIZE]; //收发缓冲区
unsigned long recvBytes; //存储接收到的字节数
SOCKADDR_IN remoteAddr; //存储数据来源IP地址
int remoteAddrLen; //存储数据来源IP地址长度
BYTE type; //操作类型
}PER_IO_OPERATION_DATA, *LPPER_IO_OPERATION_DATA;
typedef struct _completion_key//完成键
{
SOCKET sock;
char sIP[30]; //本机测试,IP都是127.0.0.1,没啥意思,实际写时候这个值填的是端口号
}COMPLETION_KEY, *LP_COMPLETION_KEY;
void pp(char *str, int data)//显示到编辑框
{
char buf[256] = { 0 };
char buf1[16] = { 0 };
char buf2[8] = { 0 };
strcat(buf, str);
buf1[0] = 0x09;
_itoa_s(data, &buf1[1], 10, 16);
strcat(buf, buf1);
*(DWORD *)&buf2 = 0x0A0D;
strcat(buf, buf2);
SendMessage(hEdit, EM_SETSEL, -2, -1);
SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)buf);
return;
}
DWORD WINAPI WorkerThread(LPVOID lpParam)//工作者线程------------------------------------------------------------------------------------------------------------------------
{
pp("工作者线程启动成功", (int)lpParam);
DWORD dwIoSize;
COMPLETION_KEY *lpComKey; //完成键
LPPER_IO_OPERATION_DATA lpIOData; //I/O数据
while (bRun)
{
dwIoSize = -1; // 字节数 完成键 OVERLAPPED结构 超时(函数返回0 WAIT_TIMEOUT)
if (GetQueuedCompletionStatus(hIocp, &dwIoSize, (LPDWORD)&lpComKey, (LPOVERLAPPED*)&lpIOData, INFINITE)) //成功非0
{
if (lpIOData->type == READ)// 收到数据 发送处理结果
{
pp(lpIOData->buffer, lpIOData->remoteAddr.sin_addr.S_un.S_addr);
pp("远程端口", lpIOData->remoteAddr.sin_port);
int len = sizeof(sockaddr_in);
DWORD flags = 0;
DWORD recvBytes = 0;
lpIOData = (LPPER_IO_OPERATION_DATA)GlobalAlloc(GPTR, sizeof(PER_IO_OPERATION_DATA));
lpIOData->DataBuff.buf = lpIOData->buffer;
lpIOData->DataBuff.len = BUFFSIZE;
WSARecvFrom(sListen, &(lpIOData->DataBuff), 1, &recvBytes, &flags, (sockaddr*)&(lpIOData->remoteAddr), sizeof(sockaddr_in), &(lpIOData->Overlapped), 0);
}
else if (lpIOData->type == WRITE)//数据已发送
{
pp("数据已发送断开客户", (int)lpComKey->sock);
}
}
else
{
DWORD dwIOError = GetLastError();
if (WAIT_TIMEOUT == dwIOError)
{
continue;
}
else if (NULL != lpIOData)
{
}
else
{
bRun = FALSE;
break;
}
}
}
pp("工作者线程退出", (int)lpParam);
return 0;
}
DWORD WINAPI TestThread(LPVOID lpParam)//测试线程
{
SOCKADDR_IN SockAddr;
SOCKET hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (hSocket != SOCKET_ERROR)
{
SockAddr.sin_family = AF_INET;
SockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
SockAddr.sin_port = htons(5888);
if (connect(hSocket, (sockaddr*)&SockAddr, 16) != SOCKET_ERROR)
{
//pp("连接成功!", 0);
char buf[100] = "光阴的故事!\n";
if (SOCKET_ERROR == send(hSocket, buf, 100, 0))
{
pp("cannot SEND message to server!", WSAGetLastError());
}
//pp("发送成功!", 0);
memset(buf, 0, strlen(buf)); //清空一下,体现是接收到的数据
if (SOCKET_ERROR == recv(hSocket, buf, 100, 0))
{
pp("cannot RECV message to server!", WSAGetLastError());
}
//pp("接收成功!", 0);
closesocket(hSocket);
}
}
return 0;
}
LRESULT CALLBACK WndProc(HWND _hWnd, UINT message, WPARAM wParam, LPARAM lParam)//处理主窗口的消息 WM_COMMAND - 处理应用程序菜单 WM_PAINT - 绘制主窗口 WM_DESTROY - 发送退出消息并返回
{
switch (message)
{
case WM_COMMAND:
{
switch (LOWORD(wParam))// 分析菜单选择:
{
case 1025://开始按钮
{
pp("开始", 0);
WSADATA ws;
if (!WSAStartup(MAKEWORD(2, 2), &ws)) //初始化SOCKET
{
pp("初始化SOCKET成功", 0);
hIocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); //初始化完成端口(句柄)
if (hIocp)
{
pp("初始化完成端口成功", (int)hIocp);
bRun = true;HANDLE ThreadHandle;SYSTEM_INFO SystemInfo;GetSystemInfo(&SystemInfo);
for (int i = 0; i < (int)SystemInfo.dwNumberOfProcessors; i++)
{
ThreadHandle = CreateThread(NULL, 0, &WorkerThread, (LPVOID)i, 0, NULL);
CloseHandle(ThreadHandle);
}
sListen = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); //创建监听套接字
if (sListen)
{
pp("创建监听套接字", (int)sListen);
InternetAddr.sin_family = AF_INET;
InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
InternetAddr.sin_port = htons(5888);
if (bind(sListen, (PSOCKADDR)&InternetAddr, sizeof(InternetAddr)) == 0)
{
pp("绑定套接字端口", (int)InternetAddr.sin_port);
//将监听套接字与完成端口绑定
LP_COMPLETION_KEY pComKey; //完成键
pComKey = (LP_COMPLETION_KEY)GlobalAlloc(GPTR, sizeof(COMPLETION_KEY));
pComKey->sock = sListen;
CreateIoCompletionPort((HANDLE)sListen, hIocp, (DWORD)pComKey, 0);
LPPER_IO_OPERATION_DATA lpIOData;
int len = sizeof(sockaddr_in);
DWORD flags = 0;
DWORD recvBytes = 0;
lpIOData = (LPPER_IO_OPERATION_DATA)GlobalAlloc(GPTR, sizeof(PER_IO_OPERATION_DATA));
lpIOData->DataBuff.buf = lpIOData->buffer;
lpIOData->DataBuff.len = BUFFSIZE;
WSARecvFrom(sListen, &(lpIOData->DataBuff), 1, &recvBytes, &flags, (sockaddr*)&(lpIOData->remoteAddr), (LPINT)&len, &(lpIOData->Overlapped), 0);
}
}
}
}
}
break;
case 1026://停止按钮
{
bRun = FALSE;
closesocket(sListen);
CloseHandle(hIocp);
WSACleanup();
}
break;
case 1027://测试按钮
{
HANDLE ThreadHandle = CreateThread(NULL, 0, &TestThread, (LPVOID)0, 0, NULL);
CloseHandle(ThreadHandle);
}
break;
default:
break;
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(_hWnd, &ps);
EndPaint(_hWnd, &ps);
}
break;
case WM_CREATE://创建控件 组合框 编辑框12 按钮截包 停止 发送 -----------------------------------------------------------------------------------------------------------
{
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", nullptr, WS_CHILD + WS_VISIBLE + WS_VSCROLL + ES_MULTILINE, 8, 8, 450, 220, _hWnd, (HMENU)1024, hInst, nullptr);
hBtn_Start = CreateWindowEx(0, "button", "开始", WS_CHILD + WS_VISIBLE, 100, 240, 64, 32, _hWnd, (HMENU)1025, hInst, nullptr);
hBtn_Stop = CreateWindowEx(0, "button", "停止", WS_CHILD + WS_VISIBLE, 280, 240, 64, 32, _hWnd, (HMENU)1026, hInst, nullptr);
hBtn_Test = CreateWindowEx(0, "button", "测试", WS_CHILD + WS_VISIBLE, 380, 240, 64, 32, _hWnd, (HMENU)1027, hInst, nullptr);
}
break;
case WM_DESTROY://程序退出
{
PostQuitMessage(0);
}
break;
default:
return DefWindowProc(_hWnd, message, wParam, lParam);
}
return 0;
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{ // 执行应用程序初始化:
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
//MyRegisterClass(hInstance);
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbW
没有合适的资源?快使用搜索试试~ 我知道了~
完成端口IOCP+UDP源码
共43个文件
tlog:6个
head:2个
pdb:2个
5星 · 超过95%的资源 需积分: 50 75 下载量 187 浏览量
2017-12-30
04:00:19
上传
评论
收藏 6.44MB RAR 举报
温馨提示
完成端口 IOCP+UDP的架构,代码为C++在 vs2015下编写的.
资源推荐
资源详情
资源评论
收起资源包目录
IocpUdpServer.rar (43个子文件)
IocpUdpServer
.gitignore 4KB
.git
info
exclude 113B
objects
pack
1c
9a181a44b4f9a105f0dc71a40ad0284ab6a7c4 2KB
c5
a1b4a395440c49a24247bba7b0f734d0152d34 4KB
info
7f
c98238ef60e15bf2608e48760f2eb9ee1d51f2 161B
2e
a8c375af72e1f9d2e6d9bfadbafb80b6406952 1KB
d0
1df8d97a8ba89569eefa9974b7f198dc25694e 501B
c9
1dab2ac98e5f375a3f61c33d960b3fcd0bd521 128B
26
74c86f6d05d39cf573c33b9ad8303558b3d274 447B
60
e4273da0ebc4e431e247e6734600aab06523ae 160B
0d
76fe4328089e5b63a9c4190badacfc35ef2624 89B
fd
6d2f6beef7c0ace3c0266c0314dacace4facc6 187B
1f
f0c423042b46cb1d617b81efb715defbe8054d 751B
HEAD 23B
description 73B
ms-persist.xml 150B
config 691B
index 584B
refs
tags
heads
master 41B
hooks
README.sample 177B
logs
HEAD 342B
refs
heads
master 342B
IocpUdpServer
IocpUdpServer.cpp 9KB
Debug
IocpUdpServer.tlog
IocpUdpServer.lastbuildstate 221B
CL.write.1.tlog 712B
link.command.1.tlog 1KB
CL.read.1.tlog 21KB
CL.command.1.tlog 702B
link.write.1.tlog 672B
link.read.1.tlog 3KB
vc140.pdb 172KB
IocpUdpServer.log 2KB
vc140.idb 523KB
IocpUdpServer.obj 42KB
IocpUdpServer.vcxproj 6KB
IocpUdpServer.vcxproj.filters 954B
.vs
IocpUdpServer
v14
.suo 28KB
IocpUdpServer.VC.db 25.39MB
Debug
IocpUdpServer.exe 42KB
IocpUdpServer.pdb 988KB
IocpUdpServer.ilk 419KB
IocpUdpServer.sln 1KB
.gitattributes 3KB
共 43 条
- 1
资源评论
- DreamLife.2019-07-23默认好评的
skmadfrag
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功