unit Unit1;interfaceuses
  Windows,winsock, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;type
  TForm1 = class(TForm)
    btnFinger: TButton;
    memInfo: TMemo;
    Label1: TLabel;
    edtHost: TEdit;
    Label2: TLabel;
    edtUser: TEdit;
    procedure btnFingerClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
    WSAData:TWSAData;
begin
    edtHost.Text:='10.13.101.10';
    edtUser.Text:='sd10008022';
//1.初始化Winsock
    if (WSAStartup(MAKEWORD(2,0),WSAData)<>0) then
    begin
        //初始化失败
        memInfo.Lines.Add('Winsock Init Failed');
        exit;
    end
    else
        memInfo.Lines.Add('Socket Start');
end;
procedure TForm1.btnFingerClick(Sender: TObject);
var
    Info:string;
    BufSend,BufRecv:pchar;
    skt:TSOCKET;
    addr:TSockAddr;
    Re:Integer;
begin
//2.建立socket
    skt:=socket(AF_INET,SOCK_STREAM,0);
    if(skt=INVALID_SOCKET)then
    begin
        memInfo.Lines.Add('Error:Create socket failed!');
        exit;
    end;
//3.连接主机
    ZeroMemory(@addr,sizeof(addr));
    addr.sin_family :=AF_INET;
    addr.sin_addr.s_addr :=inet_addr(Pchar(edtHost.Text));
    //Finger use #79 port
    addr.sin_port:=htons(79);
    Re := connect(skt,addr,sizeof(addr));
    if(Re<>0)then
    begin
         memInfo.Lines.Add('Connect to server failed');
         exit;
    end;
//4.发送信息
    GetMem(BufSend,1024);
    ZeroMemory(BufSend,1024);
    Info:=edtUser.Text+#10;
    StrPCopy(BufSend,Info);
    Re:=send(skt,BufSend^,Length(BufSend),0);
    if(Re=SOCKET_ERROR)then
    begin
         memInfo.Lines.Add('Send Data Failed');
         exit;
    end;
//5.读取主机返回信息
    GetMem(BufRecv,1024);
    repeat
      ZeroMemory(bufRecv,1024);
      re := recv(skt, BufRecv^, 1024, 0);
      Info:=StrPas(bufRecv);
      memInfo.Lines.Add(Info);
    Until  re=0;
    memInfo.Lines.Add('Finish');
    FreeMem(BufSend);
    FreeMem(BufRecv);
//6.关闭socket
    closesocket(skt);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
//6.释放Winsock
WSACleanUP();
end;end.

解决方案 »

  1.   

    unit EchoDem;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Winsock, ExtCtrls, StdCtrls, ComCtrls;type
      TForm1 = class(TForm)
        edtSend: TEdit;
        Label1: TLabel;
        btnSend: TButton;
        edtEcho: TEdit;
        Label5: TLabel;
        btnConnect: TButton;
        btnDisConnect: TButton;
        edtPort: TEdit;
        edtHost: TEdit;
        Label4: TLabel;
        Label3: TLabel;
        Bevel1: TBevel;
        StatusBar1: TStatusBar;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure btnConnectClick(Sender: TObject);
        procedure btnDisConnectClick(Sender: TObject);
        procedure btnSendClick(Sender: TObject);  private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      skt:TSocket;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    var
        WSAData:TWSAData;
    begin
        //init Socket
        if (WSAStartup(MAKEWORD(2,0),WSAData)<>0) then
        begin
            //初始化失败
            StatusBar1.SimpleText:='Init Failed';
            exit;
        end
        else
            StatusBar1.SimpleText:='Init Success';
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
         //release winsock
         WSACleanUP();
    end;procedure TForm1.btnConnectClick(Sender: TObject);
    var
        addr:TSockAddr;
        Re:Integer;
    begin
        //create socket
        skt:=socket(AF_INET,SOCK_STREAM,0);
        if(skt=INVALID_SOCKET)then
        begin
            StatusBar1.SimpleText:='Error:Create socket failed!';
            exit;
        end;
        //connect to host
        ZeroMemory(@addr,sizeof(addr));
        addr.sin_family :=AF_INET;
        addr.sin_addr.s_addr :=inet_addr(Pchar(edtHost.Text));
        //Finger use #79 port
        addr.sin_port:=htons(StrToInt(edtPort.Text));
        Re := connect(skt,addr,sizeof(addr));
        if(Re<>0)then
        begin
             StatusBar1.SimpleText:='Connect to server failed';
             exit;
        end;
        //Success Connect to host
        StatusBar1.SimpleText:='Connect to server Success';
    end;procedure TForm1.btnDisConnectClick(Sender: TObject);
    var
        re,err:integer;
        info:string;
    begin
        //close socket
        re:=closesocket(skt);
        //judge result
        if re=SOCKET_ERROR then
        begin
            err:=WSAGetLastError();
            case err of
                WSANOTINITIALISED:info:='Run WSAStartup first';
                WSAENETDOWN:info:='The network subsystem has failed.';
                WSAENOTSOCK:info:='The descriptor is not a socket.';
                WSAEINPROGRESS:info:='Sockets busy';
                WSAEINTR:info:='canceled through WSACancelBlockingCall.';
                WSAEWOULDBLOCK:info:='time-out value to large';
            end;
        end
        else
            Info:='Close socket success';
        StatusBar1.SimpleText:=info;
    end;procedure TForm1.btnSendClick(Sender: TObject);
    var
        Info:string;
        BufSend,BufRecv:pchar;
        Re:Integer;
    begin
        //send message
        GetMem(BufSend,1024);
        ZeroMemory(BufSend,1024);
        Info:=edtSend.Text;
        StrPCopy(BufSend,Info);
        Re:=send(skt,BufSend^,Length(BufSend),0);
        if(Re=SOCKET_ERROR)then
        begin
             StatusBar1.SimpleText:='Send Data Failed';
             exit;
        end;    //receive message
        GetMem(BufRecv,1024);
        ZeroMemory(bufRecv,1024);
        re := recv(skt, BufRecv^, 1024, 0);
        Info:=StrPas(bufRecv);
        edtEcho.Text:=Info;    //free pchar variant
        FreeMem(BufSend);
        FreeMem(BufRecv);
    end;end.
    以上例子,请仔细读...