UDP 通讯,接收数据一段时间后,一条消息也收不到,望各位大侠告知原因,谢谢!(200分)

  • 主题发起人 eachbuilder
  • 开始时间
E

eachbuilder

Unregistered / Unconfirmed
GUEST, unregistred user!
用 UDP 数据报方式在客户端和服务器端(512K ADSL网际互联,固定 IP,相当于局域网)进行通信,
客户端有很多(现为10个), 同时向服务器发送信息(每客户端每条消息长度:45字节,1 秒钟 4 条)。

现在的问题是,服务器端接收数据一段时间后(此段时间数据显示正常,且各个客户端交错显示),
一条消息也收不到。检查网络状况,Ping 通,TCP 通讯正常,就是 UDP 消息收不到。
把服务器端的 ADSL Modem 的电源关掉,再打开,重启服务器端程序,一切正常。不知道什么原因,
望各位大侠告知,谢谢!!

还有,像此类程序,如何尽量防止丢包,保证不阻塞,网卡如何选择?
我现在的网卡是普通的 Realtek RTL 8139 10/100M NIC
 
用我做的UDP控件试试
如果想不丢包,每次发送一个包以后最好sleep一会,
http://61.132.118.185:8080/dispdocnew.php?id=4228
 
张无忌大侠
“源码空间”要收钱了,我没有账号,请发E-mail:
webmaster@eachbuilder.com
谢谢!
另外,我想知道是什么原因?
 
不知道你用的是什么控件做的,NMUDP有BUG
 
我用的是Delphi 6 + Sp2,NMUDP,我知道它有导致不能正常关机的Bug,但是这个问题,我
不知道怎么回事?跟 Buffer size 有关吗?NMUDP 默认是多少?另外,我有Delphi5版本的
NetFaster源码,不知在Delphi 6 下能用吗?
 
恩,用我的控件把,我一会发给你,我这个控件很多熟人用过还不错的,
 
我发给你了
 
我已经收到,谢谢!
我想是不是可以排除硬件故障,包括那个中兴831 ADSL Modem和 Realtek 8139 NIC
 
恩,NMUDP在使用sendbuf的时候有BUG,很容易掉包,用sendstream效率又太地了
也容易出问题
 
张无忌大侠,源码如下,帮我分析一下,谢谢!

客户端:
PUDPCommData = ^TUDPCommData;
TUDPCommData = record
...
end;

var
UDPCommData: TUDPCommData;

procedure TSPCommDataForm.edtSPCommBufferChange(Sender: TObject);
var
TmpStream: TMemoryStream;
begin
NMUDP1.ReportLevel:= Status_Basic;
NMUDP1.RemoteHost:= gStrServerIP;
NMUDP1.RemotePort:= StrToInt(gConsServerPort);
TmpStream:= TMemoryStream.Create;
try
TmpStream.Write(UDPCommData, SizeOf(UDPCommData));
NMUDPCommData.SendStream(TmpStream);
finally
TmpStream.Free;
end;
end;


服务端:
procedure TMainForm.NMUDPCommDataDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
TmpStream: TMemoryStream;
I: Integer;
begin
TmpStream:= TMemoryStream.Create;
try
NMUDPCommData.ReadStream(TmpStream);
TmpStream.Read(UDPCommData, NumberBytes);

I:= StrToInt(UDPCommData.ClientID);
case I of
1:
begin
lblClient01.Caption:= UDPCommData.InLevel;
...
end;
2:
begin
lblClient02.Caption:= UDPCommData.InLevel;
...
end;
else
Exit;
end;
finally
TmpStream.Free;
end;
end;
 
很多问题是NMUDP本声的
 
运行中出现了问题了
 
用我做的哪个控件试试,我自认应该比NMUDP要好一些
 
无忌兄,可否给我一份? zhuq74@sina.com
 
无忌兄,现在在单位写asp呢,臭!你的控件得回家再试,谢谢,我相信你,虽然我还没试。
另外,你觉得Delphi 6自带的Indy UDP控件如何,我不大会用,不知有什么窍门?
 
Indy的UDPServer不错,我只是感觉他用一个固定的内存流来接受数据,
如果多次有大小不一致的数据到达,有内存催片什么的,不太好
 
我现在每一客户端的数据大小是一样的,我也想用Indy UDP控件,不过我摸不着头绪,
是不是在每个客户端用 Indy UDPServer控件,在服务器端用Indy UDPClient控件。

另外,在服务器端的服务器上有两块网卡,另一块网卡连结公司内部局域网,他们提出
其它机器也想收到数据,我考虑了三种方案:1、接收数据的同时转发到内部局域网;
2、在服务器上写一个网关程序;3、在服务器上设置路由(其 OS 为Win2K Server),
请各位帮我参谋一下最佳方案
 
我个人认为哪个UDPClient根本没什么用,都用UDPServer就可以了,UDP不分SERVER和
CLIENT的,呵呵
 
Delphi 6自带的Indy UPDClientServer Demo,我试了,没用,可否给我个例程。

这个需求如何解决?
“另外,在服务器端的服务器上有两块网卡,另一块网卡连结公司内部局域网,他们提出
其它机器也想收到数据,我考虑了三种方案:1、接收数据的同时转发到内部局域网;
2、在服务器上写一个网关程序;3、在服务器上设置路由(其 OS 为Win2K Server),
请各位帮我参谋一下最佳方案”
 
你要做的项目我以前做过,都解决了
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
965
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
顶部