TClientSocket的OnRead事件是在有数据来到后,马上被触发的么? (200分)

  • 主题发起人 主题发起人 WWWJP
  • 开始时间 开始时间
W

WWWJP

Unregistered / Unconfirmed
GUEST, unregistred user!
我正在做一个与PC104通信的程序,对即时性要求很高。
PC104是服务端,我的程序是客户端。
要求是我的程序连上PC104后,适当时机PC104会自动向我的程序发送指令,
在这里对即时性要求很高,要求在100毫秒以内。
问题是,有时(10%概率)会在PC104发出数据后,到我接受到数据后之间会有400~500毫秒的时间差。
请各位大侠帮忙解决。
 
要稍等几毫秒把,系统要分配消息
你如果很注重效率,用阻塞式把,最好是自己用WINSOCK函数,效率最高
 
用IdUDPClient吧,Indy的控件还是不错
 
昨天我仔细的考虑了这个问题,解决方法:
1、最快速的处理你收到的数据,提高处理效率。原因是TCP有阻塞窗口,如果你处理
TCP堆栈里的速度慢了,他会通过ACK包来降低发送方的速度。中间导致接受包出现
延时。
2、最大程度地在服务器部分把多个小规模的写操作合并成一个写操作,TCP为了提高
网络利用率,对于小的数据包通常要等待以后的数据包合并发送,中间也有延时。
如果可能的话,你可以禁用N****算法。
3、楼上的办法用UDP,前提是你的数据可以丢失,不太考虑数据的安全性。
 
我使用的是TClientSocket控件,在控件的OnRead事件里处理接受到的数据。
一旦触发OnRead事件,我马上读出数据。并用200毫秒的时间进行处理。
通常PC104端,在每个包发出后有几百毫秒的时间间隔。
数据包通常只有18字节大小。
 
那你最好不用哪个N****算法,这样效率要高很多哟,,
具体的DFW以前的帖子有,我在网吧,就不好写代码了
 
还有啊,哪个函数的TSOCKET参数用TClientSocket.handle
 
请问N****算法是什么呀?
 
是TCP为了减少网络上小的TCP分组的一种算法,比如TELNET就禁用了这个算法
你可以用WINSOCK函数禁用这个算法
 
请给出一份在Delphi里直接用WINSOCK的例子,先谢了。
 
我在网吧,不好把例子贴出来
 
请给出WINSOCK函数禁用这个N****算法的例子。
拿到例子,就分分。
 
VAR
bCan:longbool;
bCan:=true;
setsockopt(socket,IPPROTO_TCP,TCP_NODELAY,@bCan,sizeof(bCan));
 
多人接受答案了。
 
后退
顶部