我使用TIDUDP做的程序,自己给自己发送接收都没有问题,但是和同事用vc写的一个程序互发信息的时候,会莫名其妙的在原有的信息上加上一个“心形”或者一个“笑脸”,比如我发送123给他,他接到的却是“心形”123,他给我发送的时候,我接受也会出现问题,我做的程序是要直接和硬件通信的,容不得半点错误,现在我不知道问题到底出在什么地方,是Tidudp控件在发送信息时又加上了什么别的信息吗?
另外,怎么能够截取发送出去的消息到底是什么哪?想查看2进制内容,可以吗???
谢谢回答,如果分数不够可以在加。

解决方案 »

  1.   

    是不是字符串显示的问题呢。心形、笑脸都是不可见的ASCII码,所以可能是你发送的时候以字符串形式发送的,但是同时还有其他的ASCII码发送出去,所以一字符形式显示的时候会有这些东西。
    看到发送的部分程序代码才能确定问题在哪。
      

  2.   

    你是用什么函数发送的呢?
    Send(AData: string);
    还是SendBuffer(var ABuffer; const AByteCount: integer);
    你应该定义一个结构体,调用SendBuffer(...)来发送,比较合理。
      

  3.   

    我就是定义了一个结构体
    TCommBlock=record            // 用来存放消息
          Msg    :string[255];     //命令体
    end;var comm:TCommBlock;
    然后用sendbuffer(comm,sizeof(comm));
    用idudpserver接受也没有问题
    但是一旦用同事VC写的程序来接受,显示就会出现乱码(姑且这么叫吧)
      

  4.   

    乱码是在字符串前面还是后面呢。
    VC调试一下,看看接收的是否和你发送的相同,感觉应该是乱码在字符串后面出现的,VC里面碰到0认为是字符串的结尾。
    数据体再加一个字符串的长度,就好解决问题了。
    TCommBlock=record
        len:integer;
        Msg:string[255];
    end;
      

  5.   

    可以用个网络监视软件查看一下是哪一边的问题,常用的有:WinSock Expert v0.3 Beta1
    WPE PRO (Winsock Packet Editor)中文版
    Sniffer Pro v4.70.004
    等等建议用WPE PRO,小巧方便。
      

  6.   

    是出现在字符串的前面,一个“心形”
    如果我同时调用两次sendbuffer的话
    就会在接收到的第二个字符串后面出现一个“笑脸”
    太可恶了
    哎……
      

  7.   

    谢谢 DDGG(叮叮当当)
    WPE PRO在那里能down?
      

  8.   

    用法简介:
    1)首先打开WPE PRO后先点工具栏的“目标程序”按钮,选择你要监视的程序。
    2)“目标程序”按钮下边的工具栏有3个小按钮,分别是“开始”、“暂停”和“停止”。
    3)按“开始”启动监视,按“停止”终止监视,WPE PRO会自动弹出一个窗口来显示记录下来的通信数据包。
      

  9.   

    当被监视的程序退出重启后,也需要重新在WPE PRO里指定“目标程序”。
      

  10.   

    procedure TForm1.Button1Click(Sender: TObject);
    var comm:TcommBlock;
    begin
        idudp.Host:=edit1.Text;            //远端服务器地址
        idudp.Port:=StrToInt(edit3.Text);  //远端服务器端口
        comm.Msg:=edit2.Text;
        idudp.SendBuffer(comm,sizeof(comm));
        showmessage(IntToStr(sizeof(comm)));  //我又加了这么一句end;
    ----------------------------------------------
    令我吃惊的是,虽然我只是传了一个“你好”
    showmessage出来的长度却是276
    这是怎么回事?????
      

  11.   

    WPE PRO好像只能监视包的个数,但是没有办法看到包的内容阿
    DDGG(叮叮当当),再进来看看阿
      

  12.   

    TCommBlock= package record            // 用来存放消息
          Msg    :char[255];     //命令体
    end;
      

  13.   

    idudp.SendBuffer(comm,sizeof(comm));
    改成
    idudp.SendBuffer(comm,length(comm));
    试试.
      

  14.   

    你定义的结构:TCommBlock的长度是256个字节sizeof(TcommBlock)是等于256。
    SendBuffer(.....sizeof(comm)),发送了很多错误的字符。
    --------------->>>>>>>>>>>>>>>>>>>>>
    SendBuffer(......,Length(comm.Msg));
    或者修改你的包结构:
    TCommBlock=record
        len:integer;
        Msg:string[255];
    end;
    在程序对comm.Msg赋值的时候,把报文的长度赋值给comm.len,
    发送数据的时候:
    SendBuffer(.....,comm.len);
      

  15.   

    >>WPE PRO好像只能监视包的个数,但是没有办法看到包的内容阿
    >>DDGG(叮叮当当),再进来看看阿我上面已经写了,停止监视后,会自动弹出一个窗口显示监测到的通信数据包记录的。