终于有了间茅草棚

——我走时,会否有随风飘散的痕迹?

外面的风好大,雨也淅淅沥沥的。

世间种种的诱惑不惊不扰我清梦,山高路远不绝我追踪你绝美的笑容,登高一呼时才懂始终在为你心痛,俯首对花影摇动都是东风在捉弄

世间种种的迷惑都是因你而猜错,水光月光又交融描述这朗朗的夜空,生死到头的相从似狂花落叶般从容,当一切泯灭如梦就在远山被绝
随笔 - 40, 文章 - 2, 评论 - 257, 引用 - 3

导航

<2005年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

留言簿(11)

随笔档案

文章档案

收藏夹

其它的我

友情连接

网页连接

搜索

最新评论

  • 1. re: 关于质数(素数)的算法
  • 1121=19*59
  • --李圆欢
  • 2. re: void *几用
  • 方法都不错
  • --员工生日礼物
  • 3. re: void *几用
  • to oshj:
    最近才悟道这个用法,没想到你都用了很多了。

    to brent:
    不是为了玩才玩,这里每种用法在特定的情况下,都有他相应的好处。不过,我是做为自己记录的,指不定什么时候就忘记了,还可以这么用。
    1. 可以使得头文件简单,而且出于实现保密的需要,还是很有用处的。
    2. 很多时候对象本身应该简洁,但往往应对不同的需要,通常需要数据对应。举个例子,比如玩家在哪个房间,在哪个房间最好不要直接记在玩家身上,用数据注入的方式,能够很快的获得该信息。
    3. 因为是做为库暴露头文件的,使用者并不关心void *的实际意义,而且能够加快编译速度。真正要关心时,就Graphics.h这个头文件是不够的,通常会需要了解整底层个实现,才能较好的扩充。
  • --清风雨
  • 4. re: void *几用
  • 还在玩C++语言,你这玩法, 又不是用在导弹导航上...
    别人看不懂的代码,都不是好代码,分数为0

    int sub(any) { any; return TRUE;}
    (void)sub(any);

  • --brent
  • 5. re: void *几用
  • 个人用3 的情况比较多
  • --oshj
  • 6. re: 简要记录sizeof和内存对齐
  • 很清楚,受教了
  • --rdeam
  • 7. re: 局部变量
  • 我不用ATL,一般都是用标准c++支持的和平台API。
    crt里的wcs和mbs转换的函数,ms的实现是不完整的,在它的实现代码里有一段说明;而且还要设置local,比较烦琐。
  • --清风雨
  • 8. re: 简单字符串转换
  • win下,atl中有CT2CA, CW2CA等一系列转换类。
    crt中有wcstombs和mbstowcs
  • --局部变量
  • 9. re: 一个奇怪但可能有用的缓存
  • vc资料站:http://www.vcmsdn.com/     对学习很有帮助的,可以上去

    看看,或加群46138350,里面有高手可以请教的。
  • --maggie
  • 10. #progma整理
  • #pragma整理
  • --hi_wyl
  • 11. re: hpho
  • 缓冲在一等程度上是临时性的,而且实际上如果保持std::vector的iterator下次使用,也会有问题。

    所以,这个问题也就是使用时不允许这样用。
  • --清风雨
  • 12. re: 一个奇怪但可能有用的缓存
  • 如果有指针引用着arrange()所调整的那块内存,那就乱了.
  • --hpho
  • 13. re: 一个奇怪但可能有用的缓存
  • 用std::string不就行了?
  • --金庆
  • 14. re: ZiDing
  • 鉴于你的建议,前段时间我看了下boost的内存对象池,没有过于深入,
    判断下来属于做法类似,性能应该相当,甚至可能我这个略好一点。

    因为编写测试是一件相当麻烦,而且要求也很高的事,而要全面又很难。

    boost的代码我看起来比较难读,维护、调试起来对我来说是一个大麻烦。所以,我一般不选择boost。
  • --清风雨
  • 15. re: 简单内存对象池
  • 和boost的对比过没有?
  • --ZiDing

阅读排行榜

评论排行榜

贴一个头文件,恳请大家意见和想法

一个自己用于处理基本网络操作的头文件。希望大家能多提自己的想法和意见。谢谢!(内容其实很少,主要是注释比较多,所以,看起来比较长。)


1.数据类型
 typedef signed char         S8;      /// signed char (8-bit integer)
 typedef unsigned char       U8;      /// unsigned char (8-bit integer)

 typedef signed short        S16;     /// signed 16-bit short integer
 typedef unsigned short      U16;     /// unsigned 16-bit short integer

 typedef signed int          S32;     /// signed 32-bit integer
 typedef unsigned int        U32;     /// unsigned 32-bit integer

// typedef long long   S64; /// signed 64-bit integer
// typedef unsigned long long U64; /// unsigned 64-bit integer

 typedef float               F32;    /// 32-bit float
 typedef double              F64;    /// 64-bit float

2.通信的数据
/**
 * 网络数据包
 * 提供打包、解包网络数据的接口
 */
class netPacket
{
public:
 /**
  * 生成临时数据包
  */
 netPacket( void );
 /**
  * 生成数据包
  * @para stamp 网络邮标
  */
 explicit netPacket( U8 stamp );

 ~netPacket( void );

 /**
  * 生成数据包
  * @para packet 用以生成新包的旧数据
  */
 netPacket( const netPacket &packet );

 netPacket &operator=( const netPacket &packet );

 /**
  * 打包数据块
  * @return 无
  * @para data 数据块
  * @para bytes 数据块大小
  */
 void pack( const void *data,U32 bytes );

 /**
  * 解包数据块
  * @return 解包后的数据
  * @para data 解包后的数据
  * @para bytes 数据块大小
  */
 void *unpack( void *data,U32 bytes );

 /**
  * 打包基本数据
  * @return 无
  * @para data 数据
  */
 void pack( S8 data );
 void pack( U8 data );
 void pack( S16 data );
 void pack( U16 data );
 void pack( S32 data );
 void pack( U32 data );
 void pack( F32 data );
 void pack( F64 data );
 void pack( const char *data );

 /**
  * 解包基本数据
  * @return 数据
  * @para data 解得的数据
  */
 S8  unpack( S8 &data );
 U8  unpack( U8 &data );
 S16 unpack( S16 &data );
 U16 unpack( U16 &data );
 S32 unpack( S32 &data );
 U32 unpack( U32 &data );
 F32 unpack( F32 &data );
 F64 unpack( F64 &data );
 char *unpack( char *data );

 /**
  * 打包数组数据
  * @return 无
  * @para arr 数组
  * @para size 数据组大小
  */
 void pack( const S8 arr[],U32 size );
 void pack( const U8 arr[],U32 size );
 void pack( const S16 arr[],U32 size );
 void pack( const U16 arr[],U32 size );
 void pack( const S32 arr[],U32 size );
 void pack( const U32 arr[],U32 size );
 void pack( const F32 arr[],U32 size );
 void pack( const F64 arr[],U32 size );

 /**
  * 解包数组数据
  * @return 数组数据块
  * @para buf 解出的数组
  * @para size 数组大小
  */
 S8  *unpack( S8 buf[],U32 size );
 U8  *unpack( U8 buf[],U32 size );
 S16 *unpack( S16 buf[],U32 size );
 U16 *unpack( U16 buf[],U32 size );
 S32 *unpack( S32 buf[],U32 size );
 U32 *unpack( U32 buf[],U32 size );
 F32 *unpack( F32 buf[],U32 size );
 F64 *unpack( F64 buf[],U32 size );

 /**
  * 数据包的大小
  * @return 字节数
  */
 U32 size( void ) const;

 /**
  * 获取数据包数据,存入指定数据块区
  * @return 获得的数据块
  * @para buf 数据块
  * @para size 数据的大小
  * @para off 取数据的偏移
  */
 char *datas( char buf[],U32 size,U32 off = 0 ) const;

 /**
  * 数据包的网络邮标
  * @return 邮标
  */
 U8 stamp( void ) const;

private:
 class netPacketImpl;
 netPacketImpl *m_Impl;
};

3.网络处理
/**
 * 网络办公室
 * 提供网络相关功能的接口:网络包发送、接收
 */
class netOffice
{
public:
 /**
  * 连接到指定IP主机的网络通道
  * @return 无
  * @para ip 主机的IP地址
  * @para port 主机的收听端口
  */
 void connect( U32 ip,U16 port );

 /**
  * 连接建立通道
  * @return 连接完毕否
  * @para channel 建立的通道
  * @para closed 通道是否已关闭
  */
 bool connected( U32 &channel,bool &closed );

 /**
  * 在指定端口开始收听
  * @return 实际的端口
  * @para port 收听端口
  */
 U16 listen( U16 port );

 /**
  * 接受建立的通道
  * @return 建立成功否
  * @para port 服务器收听端口
  * @para channel 建立的通道
  */
 bool accepted( U16 port,U32 &channel );

 /**
  * 关闭通道
  * @return 无
  * @para channel 要关闭的通道
  */
 void close( U32 channel );

 /**
  * 已关闭的通道
  * @return 有已关闭的没
  * @ channel 已关闭的通道
  */
 bool closed( U32 &channel );

 /**
  * 发送网络包给指定网络组
  * @return 无
  * @para channel 送给哪个通道
  * @para packet 网络包
  * @para group 网络组
  */
 void post( U32 channel,U16 group,const netPacket &packet );

 /**
  * 接收网络包
  * @return 是否有网络包
  * @para channel 取哪个通道的
  * @para group 网络组
  * @para packet 接收的网络包
  */
 bool fetch( U32 channel,U16 group,netPacket &packet );

 /**
  * 通道对应的远程IP地址
  * @return IP地址
  * @para channel 哪个通道的
  */
 U32 remoteIP( U32 channel );

 /**
  * 申请网络办公室
  * @return 办公室实例
  */
 static netOffice &instance( void );

 /**
  * 转换整数ip为字符串形式
  * @return ip字符串
  * @para 整数ip
  */
 static const char *ip_str( U32 ip );
 /**
  * 转换字符串ip为整数形式
  * @return 整数ip
  * @para ip字符串
  */
 static U32 ip_int( const char * ip );

private:
 netOffice( void );
 ~netOffice( void );

 class netImpl;
 netImpl *m_Impl;
};

posted on 2005-09-25 21:48 终于有了间茅草棚 阅读(4166) 评论(16)  编辑 收藏

评论

# re: 贴一个头文件,恳请大家意见和想法

路过,看出来注释回头是要做文档用的。 :P
2005-09-26 08:13 | flyingleaf

# re: 看出来注释回头是要做文档用的

我明白是说我太懒惰,没有说明是干什么的。

有什么建议就直接说好了,怎么想怎么看就怎么说。

就是把网络编程常用的,非特殊通用的部分一起拿从出来,这样,可以减少编写网络程序的负责度。再具体,就只能是解说这个头文件了,意义不大。

主要还是想看看各位有没有什么修改建议。各方面的都行:命名也包括。
2005-09-26 10:07 | 清风雨

# re: 贴一个头文件,恳请大家意见和想法

应该是有个图比较好。懒惰了。
有兴趣网络编程的,就有劳麻烦一下了。愿意的话,就把自己的想法写一下,包括需求也好啊!
2005-09-26 10:10 | 清风雨

# re: 贴一个头文件,恳请大家意见和想法

鼓励一下!
不过你这个封装的东西没有多少实用价值啊.
2005-09-26 13:00 | huangrg

# re: 没有多少实用价值

呵呵,这个是意见之一!^_^ —— 非常感谢

欢迎继续!
2005-09-26 13:20 | 清风雨

# re: 贴一个头文件,恳请大家意见和想法

偶不敢有意见,呵呵。不过想知道你怎么压缩的包,如何解压的?用的什么算法〉?
:P
2005-09-26 16:31 | flyingleaf

# re:不过想知道

先谢谢好意!

还没有用压缩算法(暂时未遇上带宽瓶颈,而且压缩头记录本身有开销,字符串做了一下处理,别的没有);内部实现上,看个人偏向了,因为是完全自己的外部接口,所以内部用IOCP也可以,用别的也行。(因为一直觉得IOCP可以超越,所以,自己没用,不过确实不如IOCP,有时间了,可能会改用IOCP);至于UDP的考虑,暂时不打算(TNL这个UDP,个人觉得很糟糕)。

很欢迎你的压缩解压算法!:P
2005-09-26 17:13 | 清风雨

# re: 贴一个头文件,恳请大家意见和想法

高科技
2005-09-26 17:51 | gaoqing000

# re: 贴一个头文件,恳请大家意见和想法

pack等函数如果返回*this就方便了.
例如我可以 netPacket p;
p.pack(1).pack(2).pack(false).
2005-09-26 19:27 | ilovevc

# re: ilovevc

这个说法好!
2005-09-26 19:44 | 清风雨

# re: 贴一个头文件,恳请大家意见和想法

pack和unpack内会使缓冲区指针自动移动吗?不会交给上层来作的吧?
2005-10-17 12:56 | alick

# re: 贴一个头文件,恳请大家意见和想法

没明白你的意思。我估计的话,我的回答是内部做了。——个人很反对给上层做。
2005-10-18 19:37 | 清风雨

# re: ilovevc

高,有想法。

有也写过类似的东西,不过觉得不实用.
2005-11-12 12:19 | 乐言

# re: 乐言

既然没有保密意义,不妨把头文件贴出来,学习学习。cpp暂时,个人就不需要了,代码多了,懒得看,烦。
2005-11-12 21:34 | 清风雨

# re: 贴一个头文件,恳请大家意见和想法

路过,随便扯几句:)))

类型定义那里,起码应该针对不同平台定义几组不同的类型定义吧,64位平台下你也敢这么用??

打包这个类,其实就是一个读写缓冲区的管理,感觉std::stringstream都能作到,而且使用更方便,可配接性更好

连接管理这个类有点不明白,为什么做成单件呢?难道只管理一个连接?而且,connect,accept等方法都放到一个类里面,职责不明确,这个是最大的问题

2006-09-03 12:58 | 路过

# re: 路过

1. 是的。如果考虑多平台,上面的类型定义肯定会根据平台设置的。抽象为自己的定义,就是为了方便和做这件事。
2.关于stl,我一般是不会在头文件里使用的。如果是作为应用层,当然无所谓的。因为最后想把他们抽象为一个库,而且使用上也不麻烦啊pack和unpack就可以了啊,而且比较直观。
3.职责,要看职责怎么划分的。我本意就是想统一,所有的网络处理都通过它。—— 其实也是三种模式的组合:组合、代理、门面。

看到你的说法很高兴!很好的建议!
2006-09-22 10:02 | 清风雨
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]