游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3426|回复: 17

再问关于网络编程的3个问题……

[复制链接]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2006-8-28 13:36:00 | 显示全部楼层 |阅读模式
1.我一般使用的是non-blocking的socket。由于read()是系统调用,开销比较大,所以一次要读取尽量多的数据,但是这样在buf末尾的数据往往会只是完整数据包的一部分,无法解析,因为一般得是完整的连续的数据才好解析(在我的程序中是要逆序列化)。若要与下次read()的数据相拼接,那就会有内存拷贝,其中也有效率问题;若采用环形buf,则当一个数据包分布在头尾时,这个数据包的数据相当于被截断为两截,也难以解析。

2.C++标准中对对象/结构的内存分布没有规定,所以就不好直接拷贝内存去发送,而且还有字节序这些问题……那么如果要发送一个对象,该怎么做才能安全又高效?需要考虑哪些问题?

3.应用程序中,为non-blocking的socket准备的read_buffer和write_buffer各设置多大比较合适?根据什么来决定?

这些都是困扰我很久的问题,先谢谢了~

[em5]

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2006-8-28 14:55:00 | 显示全部楼层

Re:再问关于网络编程的3个问题……

灌一桶!

12

主题

88

帖子

133

积分

注册会员

Rank: 2

积分
133
发表于 2006-8-28 15:55:00 | 显示全部楼层

Re:再问关于网络编程的3个问题……

buffer由最大包长决定,拷贝是难免的,想避免多次拷贝可以buffer设置的大一些,但通常每client一收发buffer所以也不可太大.
关于内存分布问题客户端好像都跑在winodws上吧.没必要担心.

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2006-8-28 15:57:00 | 显示全部楼层

Re:再问关于网络编程的3个问题……

但是服务器会在linux上运行,而且我也想把客户端做成跨平台的……  ^_^

12

主题

88

帖子

133

积分

注册会员

Rank: 2

积分
133
发表于 2006-8-28 16:04:00 | 显示全部楼层

Re:再问关于网络编程的3个问题……

还真没考虑过这问题.要安全的话自己一个一个打包吧

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2006-8-28 17:19:00 | 显示全部楼层

Re:再问关于网络编程的3个问题……

哎,看你们讨论的辛苦,再灌一桶!
对象发送考虑用通用的协议呗…比如soap--简单对象传输协议。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2006-8-28 17:39:00 | 显示全部楼层

Re:再问关于网络编程的3个问题……

"简单对象访问协议(SOAP)是一种轻量的、简单的、基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息。"

基于xml,估计效率不够吧……

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2006-8-29 09:14:00 | 显示全部楼层

Re:再问关于网络编程的3个问题……

环形内存没什么麻烦的,我以前的一篇文章:
http://blog.csdn.net/tarkey/archive/2004/09/25/116608.aspx

read_buffer和write_buffer在我的一款休闲游戏项目里是每个玩家65535个字节的read和65535个字节的write,这个主要看你的消息逻辑来定,如果有那种很大很大的消息,比如说上千个byte的消息,就可以把缓冲区开大一点。

2

主题

18

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2006-8-29 11:15:00 | 显示全部楼层

Re:再问关于网络编程的3个问题……

2.C++标准中对对象/结构的内存分布没有规定,所以就不好直接拷贝内存去发送,而且还有字节序这些问题……那么如果要发送一个对象,该怎么做才能安全又高效?需要考虑哪些问题?

在vc里面利用宏
#pragma pack(push,1)
#pragma pack(pop)
把你需要在网络上传输的数据定义包含起来, 发送的时候就不存在字节顺序的问题了




2

主题

18

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2006-8-29 11:17:00 | 显示全部楼层

Re:再问关于网络编程的3个问题……

1.我一般使用的是non-blocking的socket。由于read()是系统调用,开销比较大,所以一次要读取尽量多的数据,但是这样在buf末尾的数据往往会只是完整数据包的一部分,无法解析,因为一般得是完整的连续的数据才好解析(在我的程序中是要逆序列化)。若要与下次read()的数据相拼接,那就会有内存拷贝,其中也有效率问题;若采用环形buf,则当一个数据包分布在头尾时,这个数据包的数据相当于被截断为两截,也难以解析

我一般自己用内存Pool来解决, 根据应用的需要决定Pool的构造
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 05:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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