GameRes游戏开发资源网
开发论坛 | 游戏人才 | 外挂技术
注册GameRes用户 登录 找回密码 |  精华区索引 | 新帖快速索引 | 本版精华区欢迎访问本论坛!

GameRes游戏开发论坛 » 程序综合、DirectX » 我封装的一个完成端口类

本主题共有9张帖子, 被点击5283 发表新主题发表回复发布新投票
yahle
Exp:780

中士
 发表于: 2005-6-25 16:03:00

我封装的一个完成端口类

下面的是基本的使用方法

struct TSession
{
SOCKET socket;
int id;
};

class myIocp:public CIOCP
{
public:
void OnRead(void * p, char * buf, int len);
void OnAccept(SOCKET socket);
void OnClose(void * p);
};

void myIocp::OnAccept(SOCKET socket)
{

TSession *s = new TSession;
s->socket = socket;
//这里可以对连接的session进行自己的操作,例如给id找一个唯一的值
SetIoCompletionPort(socket, s) // 使连接socket与一个自定义结构体关联
}

void myIocp::OnRead(void * p, char * buf, int len)
{
TSession *s  = (TSession *)p;
send(s->socket, buf, len, 0); // 这里只是[来源:GameRes.com]简单的把收到的消息返回给客户端
...
}

void myIocp::OnClose(void * p)
{
delete p;
}


myIoncp iocp;
main()
{
...
iocp.listen(4311); // 开始监听网络端口,等待客户端连接
...
}


本主题包含附件:
sf_200562516252.zip (2388bytes)
文件由用户上传,GameRes.com无法确定其安全性,请慎重使用!

 注册: 2003-7    状态: Offline 1   Top
component
Exp:50

侦察兵
 发表于: 2005-6-27 8:58:00

Re:我封装的一个完成端口类

不错, 正在学习中..........................

 注册: 2005-6    状态: Offline 2   Top
component
Exp:50

侦察兵
 发表于: 2005-6-27 9:35:00

Re:我封装的一个完成端口类

但是我不会使用,能不能把使用它的例子也传上来呢?谢谢!!!

 注册: 2005-6    状态: Offline 3   Top
homeway9916
Exp:6

新成员
 发表于: 2005-6-28 15:44:00

Re:我封装的一个完成端口类

发送代码了?


 注册: 2004-11    状态: Offline 4   Top
moonwellatg4
Exp:50

侦察兵
 发表于: 2005-7-6 17:52:00

Re:我封装的一个完成端口类

不错


 注册: 2004-11    状态: Offline 5   Top
phevos
Exp:117

侦察兵
 发表于: 2005-7-17 20:54:00

Re:我封装的一个完成端口类

研究中,我正准备把完成IO类封装到C++Builder里面

 注册: 2004-12    状态: Offline 6   Top
TaoshaGod
Exp:471

下士
 发表于: 2005-7-18 9:04:00

Re:我封装的一个完成端口类

支持。顶

 注册: 2004-6    状态: Offline 7   Top
cn_zhangJW
Exp:125

侦察兵
 发表于: 2005-7-18 17:36:00

Re: 我封装的一个完成端口类

建议作者可以考虑,抽象自己的概念。
改的更简捷些。

这样和直接用完成端口实际差别不大。

封装一个可重用的库,一定要体现它重用的意义—— 学习简单,开发高效。

 注册: 2004-4    状态: Offline 8   Top
moonwellatg4
Exp:50

侦察兵
 发表于: 2005-7-19 14:27:00

Re:我封装的一个完成端口类

1,没有封装发送的接口.

如果用户自己调用WSASend()的话,将会无法回收使用WSASend()需要创建的Buffer.

2,另外,应该加上'分包','粘包'处理的代码.

可以这么做: void OnRead() 改成 int OnRead(). 每次OnRead()返回剩余的字节数.
假设收到了1000字节的数据包,其中的800字节属于第一个数据包(逻辑上的数据包,或者叫做指令),第二个数据包的长度为500.
这时,OnRead()返回200,接着在底层(封装的类)把最后200的数据copy到buffer最前面,然后在下一个WSARecv()时候,从偏移量为200的地方开始接收,最后在下一次OnRead()时候返回整个的剩余数据包.



 注册: 2004-11    状态: Offline 9   Top
共1页,选择:   1  

主题管理:   删除关闭/取消置顶/取消精华/取消移动编辑主题

GameRes游戏开发论坛 » 程序综合、DirectX » 我封装的一个完成端口类

您尚未登录论坛,可以同通过这里进行登录,如果您不是GameRes用户,可以点击这里立即注册

关于本站 | 投稿指南 | 广告服务 | 联系本站

未经书面许可,请勿转载、链接本站内容,否则非法引用所造成的后果自负;
本站不对所提供的所有资讯正确性负责,若因资讯导致的任何损失本站概不负责,请自行斟酌。
闽ICP备05005107号
Copyright © 2001-2009 GameRes游戏开发资源网 All Rights Reserved.