再次高分求解?

zhang_ff 2000-06-12 06:40:00
我在用TNMUDP控件做一个通信程序时,在使用sendstream()方法向一台设备发出一个连接请求Message时,竟然收到11个确认请求Message,请哪位高手为我分析一下原因,谢谢了!
...全文
331 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
kxy 2000-07-06
  • 打赏
  • 举报
回复
比较难,我们也遇到类似的问题,正在试图解决
supershan 2000-07-06
  • 打赏
  • 举报
回复
在delphi的demo中有一个关于UDP的例子。我模仿着做了个简单的程序。结果在广域网上如果对方计算机是通过sygate上的网,则不能通话,因为那台计算机没有IP,它所显示的IP,是具有网关的那台计算机。所以想请教各位如何解决这种问题。

kxy,在吗?
zhang_ff 2000-06-30
  • 打赏
  • 举报
回复
致wai_lf:
但是如果连续接到11个同样的标志性信息,即使在发postmessage前加一个判断,也于事无补,回过头来我还是要再响应10次OnRecieveData。TNMUDP控件可靠吗?为什么Inprise不开发自己的UDP控件?这样我最起码能见到它的源文件。
wai_lf 2000-06-30
  • 打赏
  • 举报
回复
我想你的本意是收到某标志性信息后才postmessage的,而此标志性信息可能有一些附带信息,并且是分批打包过来的,这就可能产生违反你本意的结果,所以我建议你在你发postmessage前加一个判断,只有你收到的的信息是你需要的标志性信息时,再发postmessage.
zhang_ff 2000-06-30
  • 打赏
  • 举报
回复
致wai_lf:
因为我需要在接到设备的UDP回复后打开TCP Socket,但回复多达11次,也就是要连续响应OnRecieveData事件11次,因此我是在响应第一次OnRecieveData时使用postmessage,来处理TCP Socket,但并不能解决问题,我还是要响应10次OnRecieveData,只不过先处理TCP了.
wai_lf 2000-06-29
  • 打赏
  • 举报
回复
你在什么情况下发postmessage?
zhang_ff 2000-06-28
  • 打赏
  • 举报
回复
致kxy:
问题依旧.虽然postmessage可以将TCP/IP的工作提前进行,但是我所接收到的UDP信息多达11次,每次皆相同,重复11次postmessage不出错才怪,如果等到第11次才处理TCP/IP的工作,则会提示错误号10061,连接被rejected.还有何办法?
zhang_ff 2000-06-28
  • 打赏
  • 举报
回复
致kxy:
我想了一个办法,定义一个计数器,只要接收到UDP的信息超过一次时,就Exit,这样一来到是可以正常打开TCP Socket了,也算是解决了问题,不过这样的解决方法总是让我心里没底,毕竟连续接收UDP根本原因还不清楚.
不过,在使用TCP Socket的ReceiveBuf方法接收时,接收到的数据是错误的.我知道传来的数据的长度和结构,因此定义了一个record来存放,如下:
Type
Rec=record
...
...
end;

TForm1.ClientSocketRead(sender:tobject;socket:TCustomWinSocket);
var
MyRec:Rec;
begin
...
Socket.receiveBuf(Myrec,sizeof(Rec));
...
end;
我这样使用语句是否会产生错误?希望能指教1谢谢!
zhang_ff 2000-06-27
  • 打赏
  • 举报
回复
致各位高手:
问题依旧。但毕竟接收到了确认信息,不过当我在UDP的OnRecieveData事件中处理完收到的信息后并试图打开一个TCP/IP Socket时,竟然触发了EAccess Violation 或者EPrivilege异常,真不知为什么?是不是UDP同TCP/IPSocket不能同时使用?或者不能在UDP的事件中打开Socket?谢谢!
kxy 2000-06-27
  • 打赏
  • 举报
回复
const
MyMessage = WM_USER+100;

type
TForm1=Class(TForm)
private
procedure DoMyMessage(var Msg:TMessage);Message MyMessage;
end;

...

TForm1.DoMyMessage(var Msg:TMessage);
begin
//处理TCP/IP
end;

TForm1.UdpRecieveData(sender:TObject);
begin
//发送消息,来完成后续的工作
PostMessage(handle,My_Message,0,0);
end;
zhang_ff 2000-06-27
  • 打赏
  • 举报
回复
致kxy:
我知道PostMessage是API函数,用于将消息加入线索消息队列,但具体不知如何使用,而且从其所实现的功能来说我有些怀疑是否有用。
kxy 2000-06-27
  • 打赏
  • 举报
回复
OnRecieveData以后,PostMessage
然后在处理TCP的东西试试
zhang_ff 2000-06-27
  • 打赏
  • 举报
回复
致kxy:
是的.同这台设备进行通信的流程是:首先用UDP发送规定的请求连接信息,设备接到后回送请求连接确认信息并打开一个TCP Socket的侦听,我只有在接收到请求确认信息后,确认无误后,用其中设备传来的Port号来打开TCP Socket的连接.现在问题如上述.不能在UDP的OnRecievedData Event中打开TCP Socket,是不是它们协同使用有额外要求?有一点可以肯定,我另外又做了一个TCP的程序,在使用UDP确认连接后紧接着运行,此时TCP Socket的连接成功.但如何把这两者融合起来,你有何高见?
kxy 2000-06-27
  • 打赏
  • 举报
回复
你的server一定要用UDP吗?
kxy 2000-06-15
  • 打赏
  • 举报
回复
UDP是一种简单的协议,它提供给应用程序的服务是一种不可靠的,无连接的分组
服务,它不使用确认信息对报文的到达进行确认,不对收到的报文进行排序,也不
提供反馈信息来控制机器之间的信息流量.因此,UDP的报文可能出现丢失,重复,延迟以及乱序的错误,使用UDP的应用程序必须负责处理这些问题.
kxy 2000-06-15
  • 打赏
  • 举报
回复
使用UDP协议很头疼.
UDP是不可靠协议,可以用于简单的请求-应答的应用程序,但是应用程序内部必须有
检查错误的功能.这至少涉及确认,超时,和重传.
以下是UDP所不提供的TCP的特性
1)正面确认,丢失分组重传,重复分组检测,给被网络打乱次序的分组排序.
2)窗口式的流控
3)慢启动和拥塞避免
如果你的应用程序需要以上特性,你要自己处理.
对广播和多播的应用程序必须使用UDP以外,其他的应用使用UDP比较繁.
可以看UNIX网络编程一书.
supershan 2000-06-14
  • 打赏
  • 举报
回复
关注
zhang_ff 2000-06-13
  • 打赏
  • 举报
回复
致dudo:
message没有多大,如下:
type
TMyRec=record
Message_type:word;
Client_Applic_Name:array [0..15] of char;
Link_Number:word;
Serial_Number:dword;
Server_Applic_Name:array [0..15] of char;
Server_Applic_Instance:word;
Session_type:word;
Inactivity_timeout:word;
end;

var
QMeg:TMyRec;

begin

with QMeg do
begin
Message_type:=0;
Client_Applic_Name:='HIL_LAN_LINK';
Link_Number:=1;
Serial_Number:=8000;
Server_Applic_Name:='HIL_SERVER';
Server_applic_instance:=0;
Session_type:=0;
Inactivity_timeout:=10;
end;
end;
dudo 2000-06-13
  • 打赏
  • 举报
回复
你发的message又多大,TNMUDP一次发的message好像只能在1k以内。
sunsetyang 2000-06-12
  • 打赏
  • 举报
回复
网络中有没有其他的设备在作怪?你使用两台直接连接试一下!
MATLAB中使用FFT做频谱分析时频率分辨率问题-频率分辨率.rar MATLAB中使用FFT做频谱分析时频率分辨率问题 最近做FFT时,使用的采样频率和信号长度的取舍一直没有搞清楚,后来在论坛上发了一个贴子《总结一下使用FFT和维纳-辛钦定理求解PSD问题》(讨论见https://www.ilovematlab.cn/thread-27150-1-1.html,特别感谢会员songzy41,他的问题给了我很大启示),跟帖中给了我不少启示,并且让我对“频率分辨率”这个概念有了更深入的理解。再次一并感谢论坛的高手们。 频率分辨率,顾名思义,就是将信号中两个靠的很近的频谱分开的能力。 信号x长度为Ts,通过傅氏变换后得到X,其频率分辨率为Δf=1/T(Hz),若经过采样后,假设采样频率为fs=1/Ts,而进行频谱分析时要将这个无穷长的序列使用窗函数截断处理,假设使用矩形窗,我们知道,矩形窗的频谱为sinc函数,主瓣宽度可以定义为2*pi/M,M为窗宽,那么,时域相乘相当于频域卷积,频域内,这一窗函数能够分辨出的最近频率肯定不可能小于2*pi/M了,也就是如果数据长度不能满足2*pi/M<|w2-w1|(w2,w1为两个靠的很近的频率),那么在频谱分析时,频谱上将不能分辨出这两个谱,由于w2-w1=2*pi/fs=2*pi*Δf/fs也就是2*pi/M<2*piΔf/fs,得到Δf的限制为fs/M,这就是窗函数宽度的最小选择,就是说,根据Shannon采样定理确定了采样频率后,要根据靠的最近的谱峰来确定最小的采样长度,这样,所作出来的频谱才能分辨出那两个谱峰,也就是拥有了相应的频率分辨率。 几个例子: 考虑双正弦信号:x = sin sin;根据Shannon采样定理,采样频率要大于截止频率的两倍,这里选采样频率为80,那么,我们可以看到,Δf为0.2Hz,那么,最小的数据长度为0.2/80=400,但是对正弦信号的频谱分析经验告诉我们,在截断时截断时的数据要包含整周期,并且后面不宜补零以避免频谱泄露(这一点见胡广书《数字信号处理导论》,清华大学出版社),那么,我们要选择至少980个点,才能保含到一个整周期,另外,FFT的经验告诉我们作分析时最好选择2的整数次幂,我们选择靠的最近的1024点。分析结束。 [CODE] Fs = 80; n = 0:1/Fs:1023*1/Fs; x = sin sin; N = length; figure; X = fftshift); plot*Fs/N,abs*2/N); grid on; axis; 这是按照我们的分析进行的编程和图形 zheng.jpg 可以看出这两个谱峰很好的被分辨开来,9.8Hz不在谱线上,所以幅值不为1,以下是一些对比: [CODE] Fs = 80; n = 0:1/Fs:1023*1/Fs; x = sin sin; N = length; X = fftshift); figure; subplot plot*Fs/N,abs*2/N); grid on; axis; title; n = 0:1/Fs:979*1/Fs; x = sin sin; N = length; X = fftshift); subplot plot*Fs/N,abs*2/N); grid on; axis; title; n = 0:1/Fs:399*1/Fs; x = sin sin; N = length; X = fftshift); figure; subplot plot*Fs/N,abs*2/N); grid on; axis; title; Fs = 20; n = 0:1/Fs:1024*1/Fs; x = sin sin; N = length; X = fftshift); subplot plot*Fs/N,abs*2/N); grid on; axis; title; 结果如下: 1024.jpg 400.jpg 这是我在做FFT以及论坛中的问题时所得到的一点启发,不当之处还请大家指正。OO~ 频率分辨率.rar 为了方便大家,我将doc版报告和m文件一起上传,和帖子内容一样。OO~

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧