游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8250|回复: 8

我封装的一个完成端口类

[复制链接]

71

主题

1330

帖子

2585

积分

金牌会员

Rank: 6Rank: 6

积分
2585
发表于 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);        //        这里只是简单的把收到的消息返回给客户端
...
}

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


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

sf_200562516252.zip

2.33 KB, 下载次数:

10

主题

40

帖子

42

积分

注册会员

Rank: 2

积分
42
发表于 2005-6-27 08:58:00 | 显示全部楼层

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

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

10

主题

40

帖子

42

积分

注册会员

Rank: 2

积分
42
发表于 2005-6-27 09:35:00 | 显示全部楼层

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

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

0

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2005-6-28 15:44:00 | 显示全部楼层

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

发送代码了?

5

主题

39

帖子

45

积分

注册会员

Rank: 2

积分
45
发表于 2005-7-6 17:52:00 | 显示全部楼层

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

不错

1

主题

130

帖子

134

积分

注册会员

Rank: 2

积分
134
发表于 2005-7-17 20:54:00 | 显示全部楼层

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

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

42

主题

418

帖子

418

积分

中级会员

Rank: 3Rank: 3

积分
418
发表于 2005-7-18 09:04:00 | 显示全部楼层

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

支持。顶

8

主题

130

帖子

156

积分

注册会员

Rank: 2

积分
156
发表于 2005-7-18 17:36:00 | 显示全部楼层

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

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

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

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

5

主题

39

帖子

45

积分

注册会员

Rank: 2

积分
45
发表于 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()时候返回整个的剩余数据包.

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-26 11:52

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表