QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 754|回复: 12

关于网络编程……

[复制链接]
发表于 2004-8-24 13:15:07 | 显示全部楼层 |阅读模式
是这样的,我的网游的服务器端,对于每个TCP连接,我都建立了一个buffer,所有要发送的数据都会保存在这个buffer里,在一个循环里会处理每个连接,把要发送的数据发送出去。
问题是:
这个buffer应该怎么看呢?是一个队列还是一个循环队列?主要是我想让那些需要发送的数据在产生时直接存在这个buffer里,也就是当某个函数要发送数据时,会得到一个指针,指向这个buffer里的某个位置,然后这个函数就直接操作这个buffer……但如果当作循环队列,那么在产生数据时可能要分成两份操作……
唉,反正就是,不知道该怎么写这个发送部分……
发表于 2004-8-24 13:24:18 | 显示全部楼层
为什么要分成两份?
回复

使用道具 举报

 楼主| 发表于 2004-8-24 15:30:15 | 显示全部楼层
[________********___]

比如buffer里是上面那种情况时,前面一段是空的,后面也有一段空的,中间一段是尚未发送的数据,那么按照队列,新来的数据就要接着那段数据后面放置,但此时可能后面剩下的空间太少,不够放置一个完整数据包,如果按照队列来用,那么此时就得丢弃数据包(但有的数据包不能丢啊),或者得立即开始传输,等到数据都发送完了再从头放置新的数据(会有效率上的问题),所以就可以先把后面那段填满,然后再从buffer头部继续放置数据,这样也能充分利用buffer……但是因为要发送的数据是直接在这个buffer里“产生”的,所以在生成数据包时,必须要得到一个指针和一个int(可用缓存的长度)……但是,开始所说的那种情况让我觉得如果每次生成数据包时都要判断buffer的状态……这样会使数据包的生成太过复杂,而这个过程是给二期开发者做的(我做一个基本的引擎,二期开发者做具体的游戏),所以这个过程这么麻烦的话就不好了……
回复

使用道具 举报

发表于 2004-8-24 15:49:47 | 显示全部楼层
复杂.
回复

使用道具 举报

 楼主| 发表于 2004-8-24 18:23:03 | 显示全部楼层
4242……所以我好几天了都写不下去……
回复

使用道具 举报

发表于 2004-8-24 22:58:26 | 显示全部楼层
呵呵,引擎要写得好的话,我愿意做二期开发,等我完成手头的一些东东,就开始尝试写单机版的泡泡堂,如顺利就做网络版。
回复

使用道具 举报

 楼主| 发表于 2004-8-25 14:20:52 | 显示全部楼层
[quote:5de3f45898="lanche"]呵呵,引擎要写得好的话,我愿意做二期开发,等我完成手头的一些东东,就开始尝试写单机版的泡泡堂,如顺利就做网络版。[/quote]

…………
我也愿意做二期开发啊~~~~~~~~把我设计的东东都做出来的话,二期开发要做的就是实现游戏仿真部分和确定数据包格式……当然客户端是要另外做的……
回复

使用道具 举报

 楼主| 发表于 2004-8-25 19:19:41 | 显示全部楼层
今天早上想到的一点:

底层的操作只是提供add_to_buffer(const void* data, int len)这样的函数,而不是什么指针……每次add_to_buffer()都用来把一段已经存在的数据拷贝到buffer里(顺序存储的),所以一个数据包的生成(和添加)过程可能需要进行多次这种操作才能完成。
当一些数据因为buffer已满而暂时无法发送时该如何对待这些数据?
我还得提供一种机制,来让二线开发人员用一种办法来定义数据包的结构,并且我要提供一个函数,来识别这些定义并提供生成数据包的功能……在响应函数里,调用的只是这样的生成数据包的函数,具体的生成过程和add_to_buffer的过程是不用响应函数去过问的。
提供函数,让数据包生成函数在调用add_to_buffer()前调用,以明确将要生成的数据包的长度从而确定buffer里的剩余空间是否足够,从而确定下一步是生成数据包并添加到buffer 还是放弃生成数据包 或者是其他操作……当确定了buffer里的空间足够时,就直接把数据添加到buffer里而不需要每次都判断空间是否足够了(因为已经确定过了)……当然还有个问题:如果添加一个完整数据包的过程中只是对一段连续的buffer空间的操作,那么就不用进行空间操作的越界检查,因为这时已经确定了当所有数据被添加到buffer里时是肯定不会越界的;但是如果这个过程操作的是不连续的buffer空间(buffer两头空闲,中间有段数据时,而且后面那段的空间不够),那么每次内存操作都必须进行越界检查以判断是否操作到了buffer尾(这时就得再从头上开始操作),这样就不能达到避免过多越界检查的目的了……当然,如果每次add_to_buffer()操作都进行一次检查,那么可以减少检查次数,但是可能效果不够理想……
回复

使用道具 举报

发表于 2004-8-26 14:55:19 | 显示全部楼层
你先做着,把文档写得详细一点,雏形出来以后再提给大家看看。
回复

使用道具 举报

 楼主| 发表于 2004-8-26 14:58:03 | 显示全部楼层
呵呵~~估计到时候二期开发人员还是我自己~
回复

使用道具 举报

发表于 2004-8-26 15:03:18 | 显示全部楼层
那有什么要紧,能者多劳嘛      
回复

使用道具 举报

 楼主| 发表于 2004-8-27 01:01:21 | 显示全部楼层
不过我坚信只要我这套系统做得好,并且自己做出一款游戏来证明它,以后会有一些二期开发人员加入的。
回复

使用道具 举报

发表于 2004-8-27 21:37:33 | 显示全部楼层
还是年轻人有志气啊!
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-7 15:26 , Processed in 0.041271 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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