高并发TCP网络服务框架
来源:互联网 发布:win10无法连接隐藏网络 编辑:程序博客网 时间:2024/06/14 16:09
源码:http://blogimg.chinaunix.net/blog/upfile2/071118224425.rar
测试
#include <stdio.h>
#include "./lance/ldebug.h"
#include "./lance/tcpsrv.hpp"
#include "./lance/systm.h"
class MyClient : public lance::net::Client
{
public: void OnConnect()
{
printf("OnConnect: fd=%08x, ip=%d, port=%d\n", fd, ip, port);
recv(data, 255);
}
public: void OnDisconnect()
{
printf("OnDisconnect: fd=%08x, ip=%d, port=%d\n", fd, ip,port);
}
public: void OnRecv(int len)
{
data[len] = 0x00;
printf("OnRecv: fd=%08x, data=%s\n", fd, data);
if (data[0] == 'a')
{
printf("user exit command\n");
close();
}
recv(data, 255);
}
public: char data[256];
};
int main(char * args[])
{
lance::net::TCPSrv<MyClient> srv;
srv.ip = 0;
srv.port = 1234;
srv.ptr = NULL;
srv.backlogs = 10;
srv.threads = 1;
srv.scheds = 0;
srv.start();
while(true)
{
lance::systm::sleep(2000);
}
return 0;
}
Windows平台
Linux平台
FreeBSD平台
使用
// Client对象类,当连接建立时自动创建,当连接断开时自动销毁
class MyClient : public lance::net::Client
{
// 连接建立时被调动
public: void OnConnect()
{
printf("OnConnect: fd=%08x, ip=%d, port=%d\n", fd, ip, port);
// 通知调度系统接收数据
// 数据这时并没有真正接收,当客户端有数据发送来时
// 调度器自动接收数据,然后通过OnRecv通知数据接收完成
recv(data, 255);
}
// 连接断开时被调用
public: void OnDisconnect()
{
printf("OnDisconnect: fd=%08x, ip=%d, port=%d\n", fd, ip,port);
}
// 当有数据被接收时调用,接收的实际数据长度为len
public: void OnRecv(int len)
{
data[len] = 0x00;
printf("OnRecv: fd=%08x, data=%s\n", fd, data);
// 断开连接命令
if (data[0] == 'a')
{
printf("user exit command\n");
// 通知调度系统断开连接,当调度系统处理完成后才真正断开连接
close();
}
// 通知调度系统接收数据
// 数据这时并没有真正接收,当客户端有数据发送来时
// 调度器自动接收数据,然后通过OnRecv通知数据接收完成
recv(data, 255);
}
// 数据缓冲区
public: char data[256];
};
int main(char * args[])
{
lance::net::TCPSrv<MyClient> srv;
// 设置监听套接字绑定的IP
// 0为绑定所有本机可用IP地址
srv.ip = 0;
// 监听端口
srv.port = 1234;
// 绑定的对象或资源指针
// MyClient里面可以通过srv->ptr获取这个指针
srv.ptr = NULL;
// 监听套接字连接队列长度
srv.backlogs = 10;
// 处理线程池线程数
srv.threads = 1;
// 调度器线程数,通常是本机CPU数的2倍
// 0表示自动选择
srv.scheds = 0;
// 启动网络服务
srv.start();
// 循环,保证进程不退出
while(true)
{
lance::systm::sleep(2000);
}
return 0;
}
#define EPOLL_MAX_NFDS 10000 // max sockets queried by epoll.
#define EPOLL_MAX_EVENTS 100 // max events queried by epoll.
#define EPOLL_MAX_QUEUE 1024 // max events in cache queue.
#define KQUEUE_MAX_NFDS 10000 // max sockets queried by kqueue.
#define KQUEUE_MAX_EVENTS 100 // max events queried by kqueue.
#define KQUEUE_MAX_QUEUE 1024 // max events in cache queue.
Windows IOCP设计
template<typename T>
void Scheduler<T>::push(T * clt)
{
::PostQueuedCompletionStatus(iocp, 0, (ULONG_PTR)clt, NULL);
}
template<typename T>
DWORD WINAPI Processor<T>::run(LPVOID param)
{
Processor<T>& procor = *(Processor<T> *)param;
Scheduler<T>& scheder = *procor.scheder;
HANDLE iocp = scheder.iocp;
DWORD ready;
ULONG_PTR key;
WSAOVERLAPPED * overlap;
while (true)
{
::GetQueuedCompletionStatus(iocp, &ready, &key, (LPOVERLAPPED *)&overlap,INFINITE);
T * clt = (T *)key;
switch(clt->event)
{
case T::EV_RECV:
{
if (0 >= ready)
{
clt->event = T::EV_DISCONNECT;
::PostQueuedCompletionStatus(iocp, 0, (ULONG_PTR)clt, NULL);
}
else
{
clt->OnRecv(ready);
}
}
break;
case T::EV_CONNECT:
{
if (NULL == ::CreateIoCompletionPort((HANDLE)clt->fd, iocp,(ULONG_PTR)clt, 0))
{
::closesocket(clt->fd);
delete clt;
}
else
{
clt->OnConnect();
}
}
break;
case T::EV_DISCONNECT:
{
clt->OnDisconnect();
::closesocket(clt->fd);
delete clt;
}
break;
case T::EV_SEND:
break;
}
}
return 0;
}
Linux epoll和FreeBSD kqueue设计
template<typename T>
void Scheduler<T>::push(T * clt)
{
clt->epfd = epers[epoff].epfd;
epoff = (epoff+1 == scheds)?0:(epoff+1);
queue.in();
while (queue.full())
{
queue.fullWait();
}
if (queue.empty())
{
queue.emptyNotify();
}
queue.push(clt);
queue.out();
}
- 高并发TCP网络服务框架
- 高性能并发TCP网络服务-IOCP框架修正VC2008版本
- 高性能并发TCP网络服务-IOCP框架修正VC2008版本
- linux tcp高并发
- 快速构建MMO服务器框架(七)高并发TCP网络框架
- Java高并发框架Quasar
- epoll高性能网络服务
- nginx负载均衡教程之从不用root编译开始! + flask + uwsgi 部署高并发网络服务!
- Linux 如何高并发socket TCP
- linux c++ 高并发tcp服务器架构
- linux c++ 高并发tcp服务器架构
- linux c++ 高并发tcp服务器架构
- [Socket]基于C++的纯面向对象的通用高性能大并发TCP-SERVER/CLIENT开发框架
- 高性能、高并发TCP服务器(多线程调用libevent)
- 高性能、高并发TCP服务器(多线程调用libevent)
- 高性能、高并发TCP服务器(多线程调用libevent)
- 高性能、高并发TCP服务器(多线程调用libevent)
- 高性能、高并发TCP服务器(多线程调用libevent)
- Linux Platform Device and Driver
- webService
- 破解小记
- [技术分享]小谈 TMG 建立 IPsec Site-to-Site VPN
- 网路七层协议图
- 高并发TCP网络服务框架
- Cygwin 解压linux压缩包命令
- IOS 手指滑动删除
- 几种函数定义方式 stdcall, cdecl, etc....
- 图片在xml文件中直接加载.9文件
- 应用系统架构设计
- linux安装Redis服务器
- ASP.Net好的网站博客!
- GPIO