使用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发出正确的结果来呢?如能解决,全分相送,不够再加。
我使用语句: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发出正确的结果来呢?如能解决,全分相送,不够再加。
我使用语句: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的值,不知道为什么。
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.
发送一下,看看您监控发出的数据是否是:0A 0D 3B 0A D8 0A,如果发送结果是0A 0D 3B 0A 3F就不对了。因明显少了一位。
不知道怎么会多出后面3对00?? 如何不让发出时多出3对00呢?
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.