使用mswinsck.ocx组件来发送数据包,其结果令人费解:1.
我使用语句:Winsock1.SendData(chr(10)+chr(13)+chr(59)+chr(10)+chr(216)+CHR(10));
得到的16进制结果是:0A 0D 3B 0A 3F (正确的结果应该是:0A 0D 3B 0A D8 0A)2.
我使用语句:Winsock1.SendData(chr(10)+chr(13)+chr(59)+chr(10)+chr(216));
得到的16进制结果是:0A 0D 3B 0A 00 (正确的结果应该是:0A 0D 3B 0A D8)使用TcpClient1的SendBuf()发送,则都是正确的结果,真是百思不得其解,望各位帮忙解决一下,如何才能让Winsock1.SendData发出正确的结果来呢?如能解决,全分相送,不够再加。

解决方案 »

  1.   

    有朋友也遇到过这样的问题吗?有没有一个其他的控件可以替代mswinsck.ocx的。我主要是通过mswinsck.ocx发送消息到QQ的登录服务器,以取得返回的数据。用TcpClient组件能发,但没有返回值,真的很郁闷啊。
      

  2.   

    1楼的描述可能有误,现纠正一下,麻烦再帮看看,如能解决,真是太感谢了。第一次模拟发送:
    我使用语句:Winsock1.SendData(chr(10)+chr(13)+chr(59)+chr(10)+chr(216)+CHR(10));
    通过WPE软件监测得到的发送结果是依次是=>16进制:0A 0D 3B 0A 3F
                                (正确的发送应该是:0A 0D 3B 0A D8 0A)第二次模拟发送:
    我使用语句:Winsock1.SendData(chr(10)+chr(13)+chr(59)+chr(10)+chr(216));
    通过WPE软件监测得到的发送结果是依次是=>16进制:0A 0D 3B 0A 00 
                                (正确的发送应该是:0A 0D 3B 0A D8)感觉TWinsock控制不能发ASC码大于128的值,不知道为什么。
      

  3.   

    //希望我的例子对你有所帮助
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, OleCtrls, MSWinsockLib_TLB, StdCtrls;type
      TForm1 = class(TForm)
        Winsock1: TWinsock;
        Winsock2: TWinsock;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Winsock1ConnectionRequest(ASender: TObject;
          requestID: Integer);
        procedure FormCreate(Sender: TObject);
        procedure Winsock2Connect(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure WinsockDataArrival(ASender: TObject; bytesTotal: Integer);
        procedure WinsockClose(Sender: TObject);
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.WinsockDataArrival(ASender: TObject;
      bytesTotal: Integer);
    var
      Data:OleVariant;
      Msg:String;
    begin
      TWinsock(ASender).GetData(Data);
      SetLength(Msg,bytesTotal);
      Move(VarArrayLock(Data)^,Msg[1],bytesTotal);
      ShowMessage(Msg);
      VarArrayUnLock(Data);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Winsock2.Connect('127.0.0.1',1981);
    end;procedure TForm1.Winsock1ConnectionRequest(ASender: TObject;
      requestID: Integer);
    begin
      with  TWinsock.Create(nil) do
      begin
        Accept(requestID);
        OnDataArrival:=WinsockDataArrival;
        OnClose:=WinsockClose;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      with Winsock1 do
      begin
        Bind(1981);
        Listen;
      end;
    end;procedure TForm1.Winsock2Connect(Sender: TObject);
    begin
      Winsock2.SendData('非常好!!122');
    end;procedure TForm1.WinsockClose(Sender: TObject);
    begin
      TWinsock(Sender).Free;
    end;end.
      

  4.   

    非常感谢 wizardqi(男巫) 的源码。如果方便希望您能换成:Winsock2.SendData(chr(10)+chr(13)+chr(59)+chr(10)+chr(216));
    发送一下,看看您监控发出的数据是否是:0A 0D 3B 0A D8 0A,如果发送结果是0A 0D 3B 0A 3F就不对了。因明显少了一位。
      

  5.   

    通过发送byte型的数据是可以的,但有个问题又出现了:只发一个winsock1.SendData(10); 但发送监控得到这样的:01 00 00 00,多出了三对00
    不知道怎么会多出后面3对00?? 如何不让发出时多出3对00呢?
      

  6.   

    //我想问题出在数据与OleVariant类型的转换,你可以试试下面代码,工作很正常.
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, OleCtrls, MSWinsockLib_TLB, StdCtrls;type
      TForm1 = class(TForm)
        Winsock1: TWinsock;
        Winsock2: TWinsock;
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Winsock1ConnectionRequest(ASender: TObject;
          requestID: Integer);
        procedure FormCreate(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure WinsockDataArrival(ASender: TObject; bytesTotal: Integer);
        procedure WinsockClose(Sender: TObject);
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.WinsockDataArrival(ASender: TObject;
      bytesTotal: Integer);
    var
      Data:OleVariant;
      Msg,HexStr:String;
      i:Integer;
    begin
      TWinsock(ASender).GetData(Data);
      SetLength(Msg,bytesTotal);
      Move(VarArrayLock(Data)^,Msg[1],bytesTotal);
      for i:=1 to bytesTotal do HexStr:=HexStr+'#'+IntToHex(Ord(Msg[i]),2);
      ShowMessage(HexStr);
      VarArrayUnLock(Data);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      Bytes:OleVariant;
    begin
      Bytes:=VarArrayCreate([0,4],varByte);
      Bytes[0]:=10;
      Bytes[1]:=13;
      Bytes[2]:=59;
      Bytes[3]:=10;
      Bytes[4]:=216;
      Winsock2.SendData(Bytes);
      Bytes:=unassigned;
    end;
    procedure TForm1.Winsock1ConnectionRequest(ASender: TObject;
      requestID: Integer);
    begin
      with  TWinsock.Create(nil) do
      begin
        Accept(requestID);
        OnDataArrival:=WinsockDataArrival;
        OnClose:=WinsockClose;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      with Winsock1 do
      begin
        Bind(1981);
        Listen;
      end;
      Winsock2.Connect('127.0.0.1',1981);
    end;procedure TForm1.WinsockClose(Sender: TObject);
    begin
      TWinsock(Sender).Free;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      Winsock2.SendData(char(10));
    end;end.
      

  7.   

    顺便问一下Bytes:=unassigned;是什么意思呢。  :)))