首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Delphi API Socket通讯接收不到数据。解决方案

2014-01-17 
Delphi API Socket通讯接收不到数据。与TCP调试助手做服务器,下面程序能正常发送数据,就是接收不到数据,哪

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.


[解决办法]
你确定服务器有返回数据吗?

[解决办法]
先确定服务器端是否有返回数据,另外,不要在非主线程中操作vcl,例如118行就是错误的用法。

热点排行