|
Lazarus的INet控件在WINCE下编译不过,没办法,自己动手了
TCP_客户端- unit uTcp_Cln;
- {
- Runtime:
- lazarus-1.0RC2-fpc-2.6.0-win32.exe
- lazarus-1.0RC2-fpc-2.6.0-cross-arm-wince-win32.exe
- Wince6.0
- Powered by: Fireyu
- 2012.09.19;
- Free for All;
- }
- {$mode objfpc}{$H+}
- interface
- uses
- Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
- ExtCtrls, Sockets;
- type
- { TfrmTcpCln }
- TfrmTcpCln = class(TForm)
- btnAccept: TButton;
- edtData: TEdit;
- ImgLogo: TImage;
- ip1: TEdit;
- ip2: TEdit;
- ip3: TEdit;
- ip4: TEdit;
- edtPort: TEdit;
- gbxTcp: TGroupBox;
- Label1: TLabel;
- Label2: TLabel;
- Label3: TLabel;
- MTCP: TMemo;
- procedure btnAcceptClick(Sender: TObject);
- private
- { private declarations }
- public
- { public declarations }
- tcpSock : TSocket;
- tcpServer : TSockAddr;
- tcpLen: tsocklen;
- sData : String;
- DataLen : Integer;
- end;
- var
- frmTcpCln: TfrmTcpCln;
- implementation
- {$R *.lfm}
- { TfrmTcpCln }
- procedure TfrmTcpCln.btnAcceptClick(Sender: TObject);
- var
- rc : Integer;
- sIp : String;
- iPort : Integer;
- sBuff : String;
- begin
- tcpSock:= fpsocket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
- if tcpSock=SOCKET_ERROR then
- begin
- MTCP.Lines.Add('Socket Error!');
- CloseSocket(tcpSock);
- Exit;
- end;
- try
- sIp := IntToHex(StrToInt(Ip4.Text),2)
- +IntToHex(StrToInt(Ip3.Text),2)
- +IntToHex(StrToInt(Ip2.Text),2)
- +IntToHex(StrToInt(Ip1.Text),2);
- except
- MTCP.Lines.Add('IP Set Error!');
- CloseSocket(tcpSock);
- Exit;
- end;
- try
- iPort := StrToInt(edtPort.Text);
- except
- MTCP.Lines.Add('Port Set Error!');
- CloseSocket(tcpSock);
- Exit;
- end;
- tcpServer.sin_addr.s_addr:= StrToInt('$'+sIp);
- tcpServer.sin_family:= AF_INET;
- tcpServer.sin_port:= htons(iPort);
- tcpLen := SizeOf(tcpServer);
- rc := fpbind(tcpSock,@tcpServer,tcpLen);
- rc := fpconnect(tcpSock,@tcpServer,tcpLen);
- DataLen := Length(edtData.Text);
- sBuff := edtData.Text;
- rc := fpsend(tcpSock,PChar(sBuff),DataLen,0);
- if rc < 1 then
- begin
- MTCP.Lines.Add('Send Error!');
- CloseSocket(tcpSock);
- Exit;
- end;
- CloseSocket(tcpSock);
- MTCP.Lines.Add('Send Data Success!');
- end;
- end.
-
复制代码
TCP服务器端- unit uTcp_Srv;
-
- {$mode objfpc}{$H+}
-
- {
- Runtime:
- lazarus-1.0RC2-fpc-2.6.0-win32.exe
- lazarus-1.0RC2-fpc-2.6.0-cross-arm-wince-win32.exe
- Wince6.0
-
- Powered by: Fireyu
- 2012.09.19;
-
- Free for All;
- }
-
- interface
-
- uses
-
- Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
- ExtCtrls, Sockets;
-
- type
-
- { TfrmTcp_Srv }
-
- TfrmTcp_Srv = class(TForm)
- btnListon: TButton;
- btnEnd: TButton;
- edtPort: TEdit;
- gbxLazarus: TGroupBox;
- ImgLogo: TImage;
- Label1: TLabel;
- MTCP: TMemo;
- procedure btnEndClick(Sender: TObject);
- procedure btnListonClick(Sender: TObject);
- procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
- private
- { private declarations }
- public
- { public declarations }
- end;
-
- var
- frmTcp_Srv: TfrmTcp_Srv;
- bContinue : Boolean;
- TcpSock : TSocket;
- TcpServer : TSockAddr;
-
- TcpSock_Client : Tsocket;
- TcpServer_Client : TSockAddr;
- iLen, iCLen : Integer;
-
- sAll : String;
-
- implementation
-
- {$R *.lfm}
-
- { TfrmTcp_Srv }
-
- function TcpReceived(pParam : Pointer):Integer;register;
- var
- rc,iL : Integer;
- sBuff : Array[0..1023] of BYTE;
- sktClient : Tsocket;
- begin
- sktClient:= Tsocket(pParam^); //获取客户端Socket
-
- rc := fprecv(sktClient,@sBuff,1024,MSG_PARTIAL); //MSG_PARTIAL阻塞模式
- if rc >= 0 then
- begin
- //锁开始
- iL := 0;
- sAll := '';
- while (iL < rc) do
- begin
- sAll := sAll+Char(sBuff[iL]);
- Inc(iL);
- end;
- sAll :='DataLen:'+IntToStr(rc)+'|Data:'+sAll;
- frmTcp_Srv.MTCP.Lines.Add(sAll); //错误的示范!请用消息传递或者异步锁
- //锁结束
- end;
-
- CloseSocket(sktClient); //不要忘记关闭Socket!
- Result:=1;
- end;
-
- function CreateTcp(pParam : Pointer):Integer;register;
- var
- ITcp_Id : TThreadID;
- begin
- ITcp_Id := 0;
- while (bContinue) do //服务开始运行!
- begin
- TcpSock_Client := fpaccept(tcpSock,@TcpServer_Client,@iCLen);
- if TcpSock_Client > -1 then
- begin;
- BeginThread(@TcpReceived,@TcpSock_Client,ITcp_Id,0); //接1次数据即销毁线程,不连接不接收
- end;
- end;
- Result := 1;
- end;
-
- procedure TfrmTcp_Srv.btnListonClick(Sender: TObject);
- var
- rc, iPort, iLog : Integer;
- Tcp_ID : TThreadID;
- begin
- tcpSock:= fpsocket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
-
- Handle:= Self.Handle;
- if tcpSock=SOCKET_ERROR then
- begin
- MTCP.Lines.Add('Socket Error!');
- CloseSocket(tcpSock);
- Exit;
- end;
-
- iPort := StrToInt(edtPort.Text);
-
- tcpServer.sin_addr.s_addr:= INADDR_ANY;
- tcpServer.sin_family:= AF_INET;
- tcpServer.sin_port:= htons(iPort);
-
- iLen := SizeOf(tcpServer);
-
- rc := fpbind(tcpSock,@tcpServer,iLen);
-
- if rc < 0 then
- begin
- MTCP.Lines.Add('Bind Socket Error!');
- end;
-
- iLog := 5; //最大监听连接数iLog
- fplisten(tcpSock,iLog); //开始监听
-
- bContinue:= True;
- Tcp_ID:=0;
- MTCP.Lines.Add('Server Is Ready!');
-
- iCLen := SizeOf(TcpServer_Client);
-
- BeginThread(@CreateTcp,nil,Tcp_ID,0);
-
- end;
-
- procedure TfrmTcp_Srv.btnEndClick(Sender: TObject);
- begin
- bContinue:= False; //通知程序全部结束
- end;
-
- procedure TfrmTcp_Srv.FormClose(Sender: TObject; var CloseAction: TCloseAction);
- begin
- //关闭程序时,关闭Socket
- CloseSocket(TcpSock);
- CloseSocket(TcpSock_Client);
- end;
-
-
- end.
复制代码 |
评分
-
查看全部评分
|