游戏开发论坛

 找回密码
 立即注册
搜索
查看: 11351|回复: 55

我写的网络模块,大家来看看,不用也来讨论讨论……

[复制链接]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2009-5-19 07:07:00 | 显示全部楼层 |阅读模式
首先上网址:
http://sourceforge.net/projects/netgate

netgate是我做的一个以独立进程为形式的网络模块。
1.开源,GPL
2.使用C++编写
3.只支持linux
4.epoll(ET)+非阻塞socket+单线程
5.netgate本身是一个独立的进程,它会载入指定的动态链接库(.so文件)进行通信控制,并且通过管道与本地进程通信并为其提供通信服务,但接受服务的本地进程不需要任何网络相关代码,也不需要包含netgate的头文件,不需要连接额外的库,只需要能够处理stdio即可
6.netgate载入的动态链接库是根据具体应用编写的,但仍然有可能具有通用性,它需要包含netgate的头文件,连接netgate的库(动态链接库需要连接库吗?反正我makefile里是连了,不知道是否必要),netgate给这个动态链接库的编写者提供了一套C++风格的接口,主要是通过异常机制报错以及提供了stl iostream风格的数据收发接口,由于C++的ABI貌似还缺少标准,所以为了异常能够正确运行,貌似需要确保编译动态链接库的编译器与编译 netgate本身的编译器是相同的(也许版本也需要相同?)如果这以后成为了一个问题,也可能放弃使用异常这种报错机制。

主要有两个命令:
netgate-node:用于建立通信节点,通过命令行参数指定要载入的动态链接库以及指定节点名,通信节点可以与其他通信节点或本地进程建立通信(目前只支持管道与TCP连接这两种,但无论是哪种,对于载入的动态链接库来说都只会接触到抽象的“Channel”概念,操作的都是连续可靠的数据流)
netgate-access:用于与本地的通信节点进行通信,主要用途是把本地的一个文件描述符重定向到某个本地的通信节点上

项目开始不久,目前只有我一个人在做,文档没有怎么做……不过在文档完整之前,我会充当人肉文档的……
另外大家直接在线浏览SVN里的代码吧,download里那个包是很久以前的,过时了


本人现在深圳南山找网游服务器端的开发工作
[em10]

15

主题

368

帖子

406

积分

中级会员

Rank: 3Rank: 3

积分
406
发表于 2009-5-19 09:52:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

开源行为值得支持。

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-5-19 09:52:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

原来ls的在南山啊,呵呵

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2009-5-19 13:32:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

原来2楼的也在南山啊



话说没人评论一下吗……比如这套机制可能会有什么问题

4

主题

64

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2009-5-19 15:05:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

需要注意:
1、接口。
2、架构。
3、使用简单的东西。
评论:
1、既然是提供出去,就要把接口和实现分来,那些是给用户看的,那些不是
2、网络要讲究先稳定后效率。这就要模块本身的架构(可能我没有看出来)要合适,这样可以把避免一些简单的错误。
3、底层库,尽量不要使用string做buf。尽量做到代码简单,越简单越稳定。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2009-5-19 16:19:00 | 显示全部楼层

Re: 我写的网络模块,大家来看看,不用也来讨论讨论……

呃……可能我没说清楚……
1.接口:对于提供具体服务的程序来说,它们与外界主要的通信接口就是netgate进程,而与netgate通信的接口则是stdio;
2.架构:见附件的图


貌似ff下还是没法上传附件 =  =!

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2009-5-19 16:21:00 | 显示全部楼层

Re: 我写的网络模块,大家来看看,不用也来讨论讨论……

不会IE也不能传附件吧…………………………



貌似现在firefox和ie都不能上传附件了……

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-5-20 02:01:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

我原来在南山 呵呵
偶不懂网络,帮你顶一下吧

4

主题

64

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2009-5-20 10:21:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

我明白你的意思。我的意思是这样的:
1.接口:站在使用者的角度,我需要知道使用netgate,需要那些头文件。你的实现改变后我的程序是否受影响。
你看你的文件你的文件内容,有类继承还有头文件依赖,这是不太好的风格。

换句话说,你不因该站在你的角度来回答这个问题说“我有头文件”,而是应该站在使用者的角度,我需要那些头文件,这些是否必要,能不能更简单。库的版本变化是否要导致我重新编译等等。这是接口方面的问题。

文件stdio.h内容
#pragma once

#include "Channel.h"

class Stdio : public Channel
{
public:
        Stdio();
        ~Stdio();
public:
        int        fdIn(void) const;
        int        fdOut(void) const;
private:
        Stdio& operator = ( const Stdio& other );
};
文件channel.h内容

#pragma once

#include "EventHandler.h"
#include "Buffer.h"
#include "RestrictCopyCtor.h"

class Channel : public EventHandler, public RestrictCopyCtor< Channel >
{
public:
        Channel( EventHandler::Type type =EventHandler::T_CHANNEL );
        Channel( Buffer::ReadFun readFun, Buffer::WriteFun writeFun, EventHandler::Type type =EventHandler::T_CHANNEL );
        virtual ~Channel();
public:
        size_t        sizeRecved(void) const;
        size_t        sizeToSend(void) const;
        bool        needFlush(void) const;
        void        discard( size_t len );

        Channel& operator << ( Channel& channel );
        template< typename T >
        Channel& operator << ( const T& t )
        {
                bufOut.readFrom( &t, sizeof( T ) );
                return *this;
        }
        Channel& operator << ( const std::string& t );
        template< typename T >
        Channel& operator << ( const std::vector< T >& t )
        {
                bufOut.readFrom( &t[0], t.size() * sizeof( T ) );
                return *this;
        }
        Channel& operator << ( Channel& (*fun)( Channel& ) );

        template< typename T >
        Channel& operator >> ( T& t )
        {
                if( bufIn.size() >= sizeof( T ) ){
                        bufIn.writeTo( &t, sizeof( T ) );
                }
                return *this;
        }
        Channel& operator >> ( std::string& t );
        template< typename T >
        Channel& operator >> ( std::vector< T >& t )
        {
                size_t num= bufIn.size() / sizeof( T );
                if( t.capacity() != 0 ){
                        num= min( num, t.capacity() );
                }
                t.resize( num );
                bufIn.writeTo( &t[0], t.size() * sizeof( T ) );
                return *this;
        }

4

主题

64

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2009-5-20 10:22:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

头文件方面,你使用了Stdio.h,虽然在*nix平台可以和系统头文件stdio.h区分出来,但这是不应该的混淆。应该改名。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-20 04:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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