你发的message又多大,TNMUDP一次发的message好像只能在1k以内。

解决方案 »

  1.   

    致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;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;
      

  2.   

    使用UDP协议很头疼.
    UDP是不可靠协议,可以用于简单的请求-应答的应用程序,但是应用程序内部必须有
    检查错误的功能.这至少涉及确认,超时,和重传.
    以下是UDP所不提供的TCP的特性
    1)正面确认,丢失分组重传,重复分组检测,给被网络打乱次序的分组排序.
    2)窗口式的流控
    3)慢启动和拥塞避免
    如果你的应用程序需要以上特性,你要自己处理.
    对广播和多播的应用程序必须使用UDP以外,其他的应用使用UDP比较繁.
    可以看UNIX网络编程一书.
      

  3.   

    UDP是一种简单的协议,它提供给应用程序的服务是一种不可靠的,无连接的分组
    服务,它不使用确认信息对报文的到达进行确认,不对收到的报文进行排序,也不
    提供反馈信息来控制机器之间的信息流量.因此,UDP的报文可能出现丢失,重复,延迟以及乱序的错误,使用UDP的应用程序必须负责处理这些问题.
      

  4.   

    致各位高手:
        问题依旧。但毕竟接收到了确认信息,不过当我在UDP的OnRecieveData事件中处理完收到的信息后并试图打开一个TCP/IP Socket时,竟然触发了EAccess Violation 或者EPrivilege异常,真不知为什么?是不是UDP同TCP/IPSocket不能同时使用?或者不能在UDP的事件中打开Socket?谢谢!
      

  5.   

    致kxy:
        是的.同这台设备进行通信的流程是:首先用UDP发送规定的请求连接信息,设备接到后回送请求连接确认信息并打开一个TCP Socket的侦听,我只有在接收到请求确认信息后,确认无误后,用其中设备传来的Port号来打开TCP Socket的连接.现在问题如上述.不能在UDP的OnRecievedData Event中打开TCP Socket,是不是它们协同使用有额外要求?有一点可以肯定,我另外又做了一个TCP的程序,在使用UDP确认连接后紧接着运行,此时TCP Socket的连接成功.但如何把这两者融合起来,你有何高见? 
      

  6.   

    OnRecieveData以后,PostMessage
    然后在处理TCP的东西试试
      

  7.   

    致kxy:
        我知道PostMessage是API函数,用于将消息加入线索消息队列,但具体不知如何使用,而且从其所实现的功能来说我有些怀疑是否有用。
      

  8.   

    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;
      

  9.   

    致kxy:
        问题依旧.虽然postmessage可以将TCP/IP的工作提前进行,但是我所接收到的UDP信息多达11次,每次皆相同,重复11次postmessage不出错才怪,如果等到第11次才处理TCP/IP的工作,则会提示错误号10061,连接被rejected.还有何办法?
      

  10.   

    致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谢谢!
      

  11.   

    致wai_lf:
        因为我需要在接到设备的UDP回复后打开TCP Socket,但回复多达11次,也就是要连续响应OnRecieveData事件11次,因此我是在响应第一次OnRecieveData时使用postmessage,来处理TCP Socket,但并不能解决问题,我还是要响应10次OnRecieveData,只不过先处理TCP了.
      

  12.   

    我想你的本意是收到某标志性信息后才postmessage的,而此标志性信息可能有一些附带信息,并且是分批打包过来的,这就可能产生违反你本意的结果,所以我建议你在你发postmessage前加一个判断,只有你收到的的信息是你需要的标志性信息时,再发postmessage.
      

  13.   

    致wai_lf:
        但是如果连续接到11个同样的标志性信息,即使在发postmessage前加一个判断,也于事无补,回过头来我还是要再响应10次OnRecieveData。TNMUDP控件可靠吗?为什么Inprise不开发自己的UDP控件?这样我最起码能见到它的源文件。
      

  14.   

    在delphi的demo中有一个关于UDP的例子。我模仿着做了个简单的程序。结果在广域网上如果对方计算机是通过sygate上的网,则不能通话,因为那台计算机没有IP,它所显示的IP,是具有网关的那台计算机。所以想请教各位如何解决这种问题。kxy,在吗?