随笔-8  评论-24  文章-0  trackbacks-0
  2006年5月7日
我这篇文章说一个Socket的小技巧,另外咨询一个问题

这些天重点攻打Socket
以前总觉得Socket编程应该比较容易,也做过简单的Socket程序。
但真正要应用时,发现有很大问题!

我用C#语言

我这个程序用到的Socket也不算多。大概50个Socket客户端连接到internet上不同服务器上,用的是TCP协议。数据传输内容是一些琐碎的包,总共用到网络带宽大概512bps。

问题产生在数据延迟上了,程序对数据包的延迟要求很高,要求延迟平稳不跳动。程序每发送一个请求后,到从服务器接受到的反馈数据时间差要求基本一致。此外,程序还不停接受从服务器发送来的一些信息。

当开启几个Socket的时候,效果非常好,实时性很高,延迟稳定
但开到40个Socket的时候(每个socket连接不同服务器),就完全不一样了。发送请求后,接收到服务器响应的数据包的时间差距很大。从100ms~10000ms不等。这对于我的程序完全是个灾难!!!


在查询很多资料后,终于知道微软有个nagle算法。为了有效利用带宽,nagle算法会使得Socket发送短数据包尽量合并发送,就产生一个延迟。

使用socket.SetSocketOption(SocketOptionLevel.TCP,SocketOptionName.NoDelay,1)可以关闭nagle算法。这样发出的数据包就立刻出发了!~~ :)

程序性能终于有所改善,但还是有问题
数据包延迟从原来的100ms~10000ms变为100ms~2000ms了。这个延迟对我仍然是灾难。而ping的时间是比较稳定的40~60ms

这个就是我要向大家咨询的问题了

我也做了个测试,几台电脑通过一个电脑共享Internet连接,然后在这几台电脑上分别运行我的程序。发现延迟与所有电脑总连接数没有关系,只与当前电脑上连接数量有关。当前电脑连接越多,延迟越不稳定!!~~~如果当前电脑只有一个连接,其他电脑不管开多少连接都不会影响到这台电脑上程序的稳定!!~~~

这是什么原因呢?应该如何解决呢?
谢谢大家
posted @ 2006-05-07 11:54 闪电猪 阅读(3575) 评论(13) 编辑
这些天终于搞定线程调度的问题
开始重点攻打Socket

C#操作Socket还是比较方便
但终于还是出了问题

我这个程序用到的Socket也不算多。大概50个Socket客户端连接到internet上不同服务器上,用的是TCP协议。数据传输内容是一些琐碎的包,用到网络带宽大概512bps

问题产生在数据延迟上了
当开启几个Socket的时候,效果非常好,实时性很高,延迟稳定
然而开到40个Socket的时候,从服务器返回的数据包延迟就不稳定了。多数稳定,但有20%左右的数据包会延迟500~1000ms。我的这个程序对实时性要求很高,这个延迟可以说是种灾难。

每个Socket都设置了NoDelay关闭了微软的nagle
每个Socket是不同的线程操作,在程序上不存在阻塞问题。
CPU占用很低,2%左右。也不是资源问题。
网络带宽没有问题,Ping的延迟也很稳定


请指点一下,到底哪里出了问题呢??
谢谢各位
posted @ 2006-05-07 10:25 闪电猪 阅读(252) 评论(2) 编辑
  2006年5月4日

我用C#写了一个多线程的程序

这个程序开很多端口接收数据,每个端口分配了一个线程接受
每个接受线程对应还有一个执行线程,运行一些需要阻塞的函数

我接受网络的线程用循环的方式察看是否有数据。每个循环用Thread.Suspend()挂起
同样,配套的阻塞进程也在不停循环,每个循环Thread.Suspend()挂起

另外有一个总调度线程MainThread.这个线程在确定其他线程有了新的数据或任务时,用Thread.Resume()恢复线程运行。
MainThread不停运行一个循环。每次Thread.Sleep(1).这样可以在很多时间内进行响应。MainThread进程优先级为最高

这个程序在开启10个以内线程的时候运行时,情况还比较好。实时性很好
随着开启的线程增多,了100个后,程序实时性就不好,有时候个别线程速度缓慢!~
但是!!非常奇怪的是!!!操作系统的速度并不慢!
这个程序占用cpu就算150个线程,也只有不到5%的cpu占用

我首先将所有线程在操作系统的优先级设置为最高,但问题依旧!

我怀疑是多线程锁的问题,于是再开启一个同样的程序只运行2个线程测试,但发现另外这个程序运行的实时性能也很差!~~

我奇怪了~~

后来用高精度计时器分析MainThread.发现在线程很少的时候,很稳定是的2ms一次循环(虽然只让他停止1ms),而线程达到50多个后,MainThread就是稳定的15ms一次循环。这个和DateTime.Ticks的最小误差相同。


现在我认为是很多线程频繁调度而使得程序运行缓慢
不过我还是很疑惑cpu占用很少。这说明操作系统没有尽可能的响应我程序的请求

我该怎么办呢????

 

posted @ 2006-05-04 14:11 闪电猪 阅读(265) 评论(2) 编辑
  2006年3月22日

我用的是C#

我把DataGrid绑定到一个DataSet中的DataTable
后台有个进程不断更新这个DataTable,这时候DataGrid也会跟着改变其中的内容

但是!!!DataGrid经常出错
有时候整个程序无相应,有时候出现DataGrid的错误信息,有时候DataGrid上干脆就是红红的一个大八叉X!!

这种问题应该如何解决呢?
或者有没有办法可以让后DataGrid不跟随后台数据表一起更新呢?

posted @ 2006-03-22 11:53 闪电猪 阅读(75) 评论(0) 编辑
  2006年3月16日
我用的是windows窗体的DataGrid控件
在显示时间的时候,不显示具体的小时/分钟/秒
上网查资料,介绍的都是web下的DataGrid如何现实,form下的不能用这些办法

谁能帮帮我
谢谢~~
posted @ 2006-03-16 23:05 闪电猪 阅读(245) 评论(0) 编辑
  2006年3月12日
想用framework2.0
于是安装之
却发vs2003仍然用的1.1

于是卸载1.1
然后vs2003罢工了!!!

2003中找不到相关设置
怎么办呢?
posted @ 2006-03-12 14:12 闪电猪 阅读(649) 评论(3) 编辑

最近写了个c#的程序,这个程序运算非常多,速度就显得慢了。

想移植到vc++上用非托管代码(我对vc++还不熟)

不知道这个工作是不是非常困难??

我在c#中引用的.net库,在非托管的程序中能调用么??

posted @ 2006-03-12 11:55 闪电猪 阅读(204) 评论(0) 编辑
  2006年3月6日
摘要: 最近学习游戏中的A*算法,有点心得,写出来共享同时也希望这方面的前辈指点一下我是根据这两篇文章和其中的代码改写的,用C#语言,然后增加了惯性方向http://blog.vckbase.com/panic/archive/2005/03/20/3778.htmlhttp://blog.vckbase.com/panic/archive/2005/03/28/4144.html源代码http://ww...阅读全文
posted @ 2006-03-06 22:31 闪电猪 阅读(1887) 评论(4) 编辑
昵称:闪电猪
园龄:5年11个月
粉丝:0
关注:0
<2012年1月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

搜索

 
 

常用链接

随笔档案

最新评论

阅读排行榜

评论排行榜

推荐排行榜