Delphi API Socket通讯接收不到数据。
与TCP调试助手做服务器,下面程序能正常发送数据,就是接收不到数据,哪里有问题?
客户端程序
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, WinSock, StdCtrls;
type
TSocketComm=class(TObject)
private
function ConnectSvr: Integer;
function SendFrame(Str_SendFrame: string): Integer;
public
constructor Create;
destructor Destroy; override;
end;
type
TForm1 = class(TForm)
btn1: TButton;
btn2: TButton;
edt_SendFrame: TEdit;
mmo_Debug: TMemo;
btn3: TButton;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
skt:TSocket;
LExit:Boolean;
Svr_Addr,Clnt_Addr:TSockAddr;
ClientSocket:TSocketComm;
procedure Receive(Sock :TSocket);stdcall;
implementation
{$R *.dfm}
constructor TSocketComm.Create;
var
Wsa:TWSAData;
begin
inherited Create;
if WSAStartup(MakeWord(2,2),Wsa)<>0 then
begin
ShowMessage('Init Socket failed');
WSACleanup;
end;
end;
destructor TSocketComm.Destroy;
begin
inherited destroy;
WSACleanup;
closesocket(skt);
end;
function TSocketComm.ConnectSvr():Integer;
var
dThreadID:DWORD;
i_RtnCode:Integer;
begin
skt:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if skt=INVALID_SOCKET then
begin
ShowMessage('Create Socket failed');
WSACleanup;
Exit;
end;
Clnt_Addr.sin_family:=AF_INET;
Clnt_Addr.sin_addr.S_addr:=inet_addr('127.0.0.1');
Clnt_Addr.sin_port:=htons(StrToInt('2039'));
bind(skt,Clnt_Addr,SizeOf(Clnt_Addr));
Svr_Addr.sin_family:=AF_INET;
Svr_Addr.sin_addr.S_addr:=inet_addr('192.168.200.95');
Svr_Addr.sin_port:=htons(StrToInt('2038'));
i_RtnCode:=connect(skt,Svr_Addr,SizeOf(Svr_Addr));
if i_RtnCode<>0 then
begin
ShowMessage('Connect 192.168.200.95 failed');
WSACleanup;
Exit;
end;
LExit:=False;
BeginThread(nil, 0, @Receive, PChar(skt),0, dThreadID);
end;
procedure Receive(Sock :TSocket);stdcall;
var
BufRecv: pChar;
iRes: Integer;
begin
GetMem(BufRecv, 1024);
while not LExit do
begin
iRes := recv(Sock, BufRecv^, 1024, 0);
if iRes < 1 then
begin
Sleep(500);
Continue;
end;
Form1.mmo_Debug.Lines.Add(BufRecv);
ZeroMemory(bufRecv, 1024);
end;
FreeMem(BufRecv);
CloseSocket(Sock);
ExitThread(0);
end;
function TSocketComm.SendFrame(Str_SendFrame:string):Integer;
var
i,i_FrameLen:Integer;
i_Buf:array[1..1024] of Byte;
begin
Str_SendFrame:=StringReplace(Str_SendFrame,' ','',[rfReplaceAll]);
i_FrameLen:=Length(Str_SendFrame) div 2; //Convert string to byte string
for i:=0 to i_FrameLen-1 do
begin
i_Buf[i+1]:=StrToInt('$'+Copy(Str_SendFrame,i*2+1,2));
end;
send(skt,i_Buf,i_FrameLen,0);
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
ClientSocket:=TSocketComm.Create;
ClientSocket.ConnectSvr;
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
// closesocket(skt);
WSACleanup;
end;
procedure TForm1.btn3Click(Sender: TObject);
begin
ClientSocket.SendFrame(Trim(edt_SendFrame.Text));
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
btn2Click(nil);
end;
end.