⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 Winsock通信程序源码 用Delphi和Win API写的winsock通信程序
💻 PAS
字号:
unit main;

interface

uses
  Windows, Messages, SysUtils, Winsock, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ImgList, ToolWin, ExtCtrls, StdCtrls, XPMan, Menus,
  Buttons;

const
  WM_SOCKET_READ = WM_USER + 14;

type
  TFrmMain = class(TForm)
    ToolBar1: TToolBar;
    ImageList1: TImageList;
    ToolButton1: TToolButton;
    StatusBar1: TStatusBar;
    ToolButton2: TToolButton;
    Panel_Left: TPanel;
    Panel_Main: TPanel;
    Memo1: TMemo;
    ToolButton3: TToolButton;
    Panel3: TPanel;
    XPManifest1: TXPManifest;
    GroupBox1: TGroupBox;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    BitBtn1: TBitBtn;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    Memo2: TMemo;
    PopupMenu1: TPopupMenu;
    N8: TMenuItem;
    procedure Panel3Resize(Sender: TObject);
    procedure ToolButton1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ToolButton3Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
  private
    { Private declarations }
    hostname:string;
    server_port:integer;
    xl_hostent:phostent;
    xl_sockaddrin:TSOCKADDRIN;
    xl_socket: Integer;
    psaddr:^longint;
    saddr:integer;
    Procedure LinkSock;
    procedure InitSock;
    procedure OnSocketRead(Var message: TMessage); message WM_SOCKET_READ;
  public
    { Public declarations }
  end;

  TCarCache = Record
      Pzh: String[10];
      Cz: String[20];
      Zs: Integer;
  end;


var
  FrmMain: TFrmMain;

implementation

{$R *.dfm}

procedure TFrmMain.Panel3Resize(Sender: TObject);
begin
    Memo2.Width := Panel3.Width - 105;
    BitBtn1.Left := Panel3.Width - 90;
end;

procedure TFrmMain.LinkSock;
Var
    RET: Integer;
begin
    server_port:=StrToInt(Edit3.Text);
    hostname := Edit2.Text;
    xl_sockaddrin.sin_port := htons(server_port);
    xl_sockaddrin.sin_family := PF_INET;
    xl_hostent := GetHostByName(PCHAR(HOSTNAME));
    IF xl_hostent = nil then
    begin
        saddr := inet_addr(PCHAR(HOSTNAME));
        if saddr <> -1 then
            xl_sockaddrin.sin_addr.S_addr := saddr;
    end
    else
    begin
        psaddr := pointer(xl_hostent.h_addr_list^);
        xl_sockaddrin.sin_addr.S_addr := psaddr^;
    end;
    xl_socket:=socket(PF_INET,SOCK_STREAM,0);
    IF XL_SOCKET=INVALID_SOCKET THEN
    begin
        Application.MessageBox('SOCKET创建失败','注意',mb_ok);
    end;
    RET := CONNECT(xl_socket,xl_sockaddrin,sizeof(xl_sockaddrin));
    if ret = socket_error then
    begin
        Application.MessageBox('SOCKET连接失败','注意',mb_ok);
        ret:=closesocket(xl_socket);
        if ret=0 then
            Application.MessageBox('SOCKET释放成功!','注意',mb_ok);
    end
    else
    begin
        Application.MessageBox('SOCKET连接成功!','注意',mb_ok);
        Panel_Main.Enabled := true;
        //读取/关闭 事件
        WSAAsyncSelect(xl_socket, FrmMain.Handle, WM_SOCKET_READ, FD_READ or FD_CLOSE);
    end;
end;

procedure TFrmMain.ToolButton1Click(Sender: TObject);
begin
    Panel_Left.Visible := ToolButton1.Down;
end;

procedure TFrmMain.InitSock;
Var
    XL_WSADATA:TWSADATA;
    RET:INTEGER;
begin
    //初始化WinSock库
    RET:=WSASTARTUP(MakeWord(2,2),XL_WSADATA);
    IF RET<>0 THEN
    begin
        Application.MessageBox('初始化WInSock库失败!','错误信息',MB_OK);
    end;
end;

procedure TFrmMain.FormDestroy(Sender: TObject);
begin
    WSAcleanup;
end;

procedure TFrmMain.FormCreate(Sender: TObject);
begin
    InitSock;
end;

{ TSockServer }

procedure TFrmMain.ToolButton3Click(Sender: TObject);
begin
    CloseSocket(xl_socket);
    StatusBar1.Panels[1].Text := '已断开';
    ToolButton3.Enabled := false;
    ToolButton1.Enabled := true;
end;

procedure TFrmMain.BitBtn1Click(Sender: TObject);
var
    Buff: String[100];
    i: Integer;
begin
    {Buff.Pzh := 'JA-88888';
    Buff.Cz := '国务院';
    Buff.Zs := 4;  }
    for i := 0 to Memo2.Lines.Count - 1 do
    begin
        Buff := Memo2.Lines[i];
        Send(xl_socket,Buff,sizeof(Buff),0);
    end;
    Memo2.Clear;
end;

procedure TFrmMain.OnSocketRead(var message: TMessage);
Var
    Buff: String[100];
    RET: Integer;
begin
    CASE WSAGETSELECTEVENT(message.lParam) OF
        FD_READ:
        begin
            Ret := Recv(xl_socket,Buff,Sizeof(Buff),0);
            if Ret = SOCKET_ERROR then
            begin
                showmessage('Read Error!');
            end
            else if Ret > 0 then
            begin
                {Memo1.Lines.Add('========== Server Call Back ============');
                Memo1.Lines.Add('牌照号:' + Buff.Pzh);
                Memo1.Lines.Add('车  主:' + Buff.Cz);
                Memo1.Lines.Add('轴  数:' + IntToStr(Buff.Zs));
                Memo1.Lines.Add('========== Call Back End ============'); }
                Memo1.Lines.Add(Buff);
            end;
        end;
        FD_CLOSE:
        begin
            StatusBar1.Panels[1].Text := '已断开';
            ToolButton3.Enabled := false;
            ToolButton1.Enabled := true;
        end;
    end;
end;

procedure TFrmMain.BitBtn3Click(Sender: TObject);
begin
    ToolButton1.Down := false;
    ToolButton1.Click;
end;

procedure TFrmMain.BitBtn2Click(Sender: TObject);
begin
    LinkSock;
    ToolButton1.Down := false;
    ToolButton1.Click;
    StatusBar1.Panels[1].Text := '已连接';
    ToolButton3.Enabled := true;
    ToolButton1.Enabled := false;
end;

procedure TFrmMain.N8Click(Sender: TObject);
begin
    Memo1.Clear;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -