再次高分求解? 你发的message又多大,TNMUDP一次发的message好像只能在1k以内。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 致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;varQMeg:TMyRec;beginwith QMeg dobeginMessage_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; 使用UDP协议很头疼.UDP是不可靠协议,可以用于简单的请求-应答的应用程序,但是应用程序内部必须有检查错误的功能.这至少涉及确认,超时,和重传.以下是UDP所不提供的TCP的特性1)正面确认,丢失分组重传,重复分组检测,给被网络打乱次序的分组排序.2)窗口式的流控3)慢启动和拥塞避免如果你的应用程序需要以上特性,你要自己处理.对广播和多播的应用程序必须使用UDP以外,其他的应用使用UDP比较繁.可以看UNIX网络编程一书. UDP是一种简单的协议,它提供给应用程序的服务是一种不可靠的,无连接的分组服务,它不使用确认信息对报文的到达进行确认,不对收到的报文进行排序,也不提供反馈信息来控制机器之间的信息流量.因此,UDP的报文可能出现丢失,重复,延迟以及乱序的错误,使用UDP的应用程序必须负责处理这些问题. 致各位高手: 问题依旧。但毕竟接收到了确认信息,不过当我在UDP的OnRecieveData事件中处理完收到的信息后并试图打开一个TCP/IP Socket时,竟然触发了EAccess Violation 或者EPrivilege异常,真不知为什么?是不是UDP同TCP/IPSocket不能同时使用?或者不能在UDP的事件中打开Socket?谢谢! 致kxy: 是的.同这台设备进行通信的流程是:首先用UDP发送规定的请求连接信息,设备接到后回送请求连接确认信息并打开一个TCP Socket的侦听,我只有在接收到请求确认信息后,确认无误后,用其中设备传来的Port号来打开TCP Socket的连接.现在问题如上述.不能在UDP的OnRecievedData Event中打开TCP Socket,是不是它们协同使用有额外要求?有一点可以肯定,我另外又做了一个TCP的程序,在使用UDP确认连接后紧接着运行,此时TCP Socket的连接成功.但如何把这两者融合起来,你有何高见? OnRecieveData以后,PostMessage然后在处理TCP的东西试试 致kxy: 我知道PostMessage是API函数,用于将消息加入线索消息队列,但具体不知如何使用,而且从其所实现的功能来说我有些怀疑是否有用。 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/IPend;TForm1.UdpRecieveData(sender:TObject);begin //发送消息,来完成后续的工作 PostMessage(handle,My_Message,0,0);end; 致kxy: 问题依旧.虽然postmessage可以将TCP/IP的工作提前进行,但是我所接收到的UDP信息多达11次,每次皆相同,重复11次postmessage不出错才怪,如果等到第11次才处理TCP/IP的工作,则会提示错误号10061,连接被rejected.还有何办法? 致kxy: 我想了一个办法,定义一个计数器,只要接收到UDP的信息超过一次时,就Exit,这样一来到是可以正常打开TCP Socket了,也算是解决了问题,不过这样的解决方法总是让我心里没底,毕竟连续接收UDP根本原因还不清楚. 不过,在使用TCP Socket的ReceiveBuf方法接收时,接收到的数据是错误的.我知道传来的数据的长度和结构,因此定义了一个record来存放,如下: Type Rec=record ... ... end;TForm1.ClientSocketRead(sender:tobject;socket:TCustomWinSocket);varMyRec:Rec;begin...Socket.receiveBuf(Myrec,sizeof(Rec));...end; 我这样使用语句是否会产生错误?希望能指教1谢谢! 致wai_lf: 因为我需要在接到设备的UDP回复后打开TCP Socket,但回复多达11次,也就是要连续响应OnRecieveData事件11次,因此我是在响应第一次OnRecieveData时使用postmessage,来处理TCP Socket,但并不能解决问题,我还是要响应10次OnRecieveData,只不过先处理TCP了. 我想你的本意是收到某标志性信息后才postmessage的,而此标志性信息可能有一些附带信息,并且是分批打包过来的,这就可能产生违反你本意的结果,所以我建议你在你发postmessage前加一个判断,只有你收到的的信息是你需要的标志性信息时,再发postmessage. 致wai_lf: 但是如果连续接到11个同样的标志性信息,即使在发postmessage前加一个判断,也于事无补,回过头来我还是要再响应10次OnRecieveData。TNMUDP控件可靠吗?为什么Inprise不开发自己的UDP控件?这样我最起码能见到它的源文件。 在delphi的demo中有一个关于UDP的例子。我模仿着做了个简单的程序。结果在广域网上如果对方计算机是通过sygate上的网,则不能通话,因为那台计算机没有IP,它所显示的IP,是具有网关的那台计算机。所以想请教各位如何解决这种问题。kxy,在吗? 如何实现根据拼间检索商品名称? 如何能在formshow的事件中让label.Canvas.TextOut能写出字来? 程序(界面是一个长条)启动后停靠在桌面最上方,怎么让我的电脑等图标自动往下移动? 如何找出局域网中安装了我的应用程序服务器的所有机器 EXCEL换行的问题? 50分求一个数据库的设计???? 一个关于自定义控件的问题 如何列出本机的目录结构 如何判断动态创建的控件已经在窗体上,请帮忙 使用第三方控件会使程序发行包变得很大!如何办? oracle的数据库日期型字段如何操作? 我在使用DBGrid时发生如下情况,请各位不吝赐教
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;beginwith 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;
UDP是不可靠协议,可以用于简单的请求-应答的应用程序,但是应用程序内部必须有
检查错误的功能.这至少涉及确认,超时,和重传.
以下是UDP所不提供的TCP的特性
1)正面确认,丢失分组重传,重复分组检测,给被网络打乱次序的分组排序.
2)窗口式的流控
3)慢启动和拥塞避免
如果你的应用程序需要以上特性,你要自己处理.
对广播和多播的应用程序必须使用UDP以外,其他的应用使用UDP比较繁.
可以看UNIX网络编程一书.
服务,它不使用确认信息对报文的到达进行确认,不对收到的报文进行排序,也不
提供反馈信息来控制机器之间的信息流量.因此,UDP的报文可能出现丢失,重复,延迟以及乱序的错误,使用UDP的应用程序必须负责处理这些问题.
问题依旧。但毕竟接收到了确认信息,不过当我在UDP的OnRecieveData事件中处理完收到的信息后并试图打开一个TCP/IP Socket时,竟然触发了EAccess Violation 或者EPrivilege异常,真不知为什么?是不是UDP同TCP/IPSocket不能同时使用?或者不能在UDP的事件中打开Socket?谢谢!
是的.同这台设备进行通信的流程是:首先用UDP发送规定的请求连接信息,设备接到后回送请求连接确认信息并打开一个TCP Socket的侦听,我只有在接收到请求确认信息后,确认无误后,用其中设备传来的Port号来打开TCP Socket的连接.现在问题如上述.不能在UDP的OnRecievedData Event中打开TCP Socket,是不是它们协同使用有额外要求?有一点可以肯定,我另外又做了一个TCP的程序,在使用UDP确认连接后紧接着运行,此时TCP Socket的连接成功.但如何把这两者融合起来,你有何高见?
然后在处理TCP的东西试试
我知道PostMessage是API函数,用于将消息加入线索消息队列,但具体不知如何使用,而且从其所实现的功能来说我有些怀疑是否有用。
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;
问题依旧.虽然postmessage可以将TCP/IP的工作提前进行,但是我所接收到的UDP信息多达11次,每次皆相同,重复11次postmessage不出错才怪,如果等到第11次才处理TCP/IP的工作,则会提示错误号10061,连接被rejected.还有何办法?
我想了一个办法,定义一个计数器,只要接收到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谢谢!
因为我需要在接到设备的UDP回复后打开TCP Socket,但回复多达11次,也就是要连续响应OnRecieveData事件11次,因此我是在响应第一次OnRecieveData时使用postmessage,来处理TCP Socket,但并不能解决问题,我还是要响应10次OnRecieveData,只不过先处理TCP了.
但是如果连续接到11个同样的标志性信息,即使在发postmessage前加一个判断,也于事无补,回过头来我还是要再响应10次OnRecieveData。TNMUDP控件可靠吗?为什么Inprise不开发自己的UDP控件?这样我最起码能见到它的源文件。