首页 新闻 会员 周边

高效服务器开发:请高手一起研究IIS和IE传送问题?

0
悬赏园豆:200 [待解决问题]

最近一直在做服务器C/S架构的。遇到不少问题。我采用完成端口进行开发。
1、发现自己开发服务器 在传输速度上虽然快,但是如果连续发送数据的话。会出现数据丢失,接不包。(TCP/IP协议 按协议应该不会出现这样的问题的?可我的就出现这样的问题。纳闷中。)
2、在传输过程中 如果客户端采用无限制过期时间的话,当某些无法预料到的问题的时候,客户处于等等接收状态。一直持续下去。
3、老问题:IIS传输数据时 对数据是如何操作的 为什么其速度那么快。如果采用压缩和解压缩的话 是否为一次性压缩和解压缩,如果是一次性的话,数据量大的时候怎么办?我试过出现内存溢出的问题,或者申请空间过大内存错误。

anok的主页 anok | 初学一级 | 园豆:0
提问于:2011-07-11 08:51
< >
分享
所有回答(2)
0

1、所谓的丢包,在tcp协议里面几乎不会出现,这个是粘包/半包没有正确处理的缘故。

2、通信状态处理,需要加上心跳包来作定期检测。

3、IIS传输数据,说到底还是基于tcp协议的,传输效率当然不慢。当传输数据量过大时,底层会自动将大包切成小包发送,默认是1.5K字节左右。最好是自己切包,切成1k左右的小包,方便实用。如果是传输数据量极大,超出内存上限,可以采用分包方式,每次发送一部分数据,接受端自己组包即可。

醉卧天南 | 园豆:369 (菜鸟二级) | 2011-07-11 15:59
0

如果连续发送数据的话。会出现数据丢失,接不包。

这个问题我以前用完成端口的异步Socket做服务器是遇到过这个问题,也困惑很久。

解决方法是为每个Socket会话添加一个发送队列,只有当前一个包发送成功后才发送后一个包。

protected virtual void SafeSend(TSession s, DataBlock data)
{
s.SendQueue.Enqueue(data);

//只有一个数据包,立即发送
//如果有多个包放进的数据放进发送队列
if (s.SendQueue.Count == 1)
{
AtomSend(s, data);
}
}

protected void AtomSend(TSession s, DataBlock block)
{
try
{
if (s == null)
throw new ArgumentNullException("session");

if (block == null)
throw new ArgumentNullException("data block");

block.Tag
= s;

s.Socket.BeginSend(block.Buffer, block.ReadIndex,
block.Length, SocketFlags.None,
new AsyncCallback(SendCallback), block);
}
catch (Exception ex)
{
OnSessionError(s, ex);
}
}

南桥一梦 | 园豆:147 (初学一级) | 2011-07-12 10:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册