看看例子, unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp;type TCon = record FileName : String; TotalSize : Integer; Status : Integer; end; PCON = ^TCON; TForm1 = class(TForm) GroupBox1: TGroupBox; GroupBox2: TGroupBox; ClientSocket: TClientSocket; ServerSocket: TServerSocket; btnServerActive: TButton; btnClientCon: TButton; btnClientDisConn: TButton; BtnClientSendF: TButton; Memo1: TMemo; OpenDialog: TOpenDialog; Edit1: TEdit; Label1: TLabel; procedure btnClientConClick(Sender: TObject); procedure btnClientDisConnClick(Sender: TObject); procedure BtnClientSendFClick(Sender: TObject); procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure btnServerActiveClick(Sender: TObject); procedure ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocketClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.DFM}var Count : Integer;function GetFileSize(const FileName: string):integer; var f : TFileStream; begin f := TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone); Result :=f.Size; F.Free; end;procedure TForm1.btnClientConClick(Sender: TObject); begin ClientSocket.Active := True; with OpenDialog do begin Execute; if FileName <> '' then begin Edit1.Text := 'UPLOAD '+ ExtractFileName(FileName) +' '+Inttostr(GetFileSize(FileName)); Label1.Caption := FileName; ClientSocket.Socket.SendText(edit1.Text); end; end; end;procedure TForm1.btnClientDisConnClick(Sender: TObject); begin ClientSocket.Active := False; end;procedure TForm1.BtnClientSendFClick(Sender: TObject); var fs : TFileStream; Buf : pointer; begin fs := TFileStream.Create(Label1.Caption ,fmOpenRead or fmShareDenyNone); GetMem(Buf,fs.Size); fs.Seek(0,soFromBeginning); fs.ReadBuffer(Buf^,fs.Size); memo1.Lines.Add('has send : '+inttostr(ClientSocket.Socket.SendBuf(Buf^,fs.Size))); end;procedure TForm1.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.add(socket.ReceiveText); end;procedure TForm1.ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin ErrorCode := 0; end;procedure TForm1.btnServerActiveClick(Sender: TObject); begin ServerSocket.Active := True; end;procedure TForm1.ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket); var c : pcon; begin c :=new(pcon); c.FileName := ''; c.TotalSize := 0 ; c.Status := 0; Socket.Data := c; Socket.SendText('已经连接,请输入UPLOAD FILENAME SIZE'#13#10); end;procedure TForm1.ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); var C : PCON; cmd:String; Buffer : pointer; nRetr : integer; fs : TFileStream; const bufferSize = 1024 ;begin C:= Socket.Data ; case c.Status of 0 : begin cmd := trim(Socket.ReceiveText) ; if Pos('UPLOAD ',uppercase(cmd)) > 0 then begin c.FileName := trim(Copy(cmd,Pos(' ',cmd)+1,Length(cmd))); c.TotalSize := StrToInt(Copy(c.FileName,Pos(' ',c.FileName)+1,Length(c.FileName))); c.FileName := trim(Copy(c.FileName,1,Pos(' ',c.FileName))); c.Status := 1; Socket.Data := C; Socket.SendText('you can send File !'#13#10); end; end; 1 : begin Count := count + 1; GetMem(Buffer,BufferSize); nRetr := Socket.ReceiveBuf(Buffer^,BufferSize); Memo1.Lines.Add(IntToStr(Count) + ' ' + IntToStr(nRetr)); if not FIleExists('c:\'+c.FileName) then begin fs :=TFileStream.Create('c:\'+c.FileName,fmCreate or fmShareDenyNone); fs.Seek(0,soFromBeginning); end else begin fs :=TFileStream.Create('c:\'+c.FileName,fmOpenWrite or fmShareDenyNone); fs.Seek(0,soFromEnd); end; fs.WriteBuffer(Buffer^,nRetr); fs.Destroy; FreeMem(Buffer); end; end; end;procedure TForm1.ServerSocketClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin ErrorCode := 0; end;procedure TForm1.FormCreate(Sender: TObject); begin Count := 0; end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin ClientSocket.Active := False; ServerSocket.Active := False; end;end.
是否有不用ftp的方法呢,有实例否
怎么也需要在对方的计算机上运行个服务端或使用网上邻居下面的函数以'XX-XX-XX-XX-XX-XX' 的格式返回远程或本地机器的MAC地址。Function to return the MAC address of a remote or local machine in the format 'XX-XX-XX-XX-XX-XX' 返回的MAC地址是一个能用在多个方面的唯一标识。使用方法: ShowMessage(GetMacAddress('\\MHEYDON'); 输出'00-02-08-E7-99-6B'// ====================================================================== //返回值是主机AServerName的MAC地址 //AServerName参数的格式为'\\ServerName' 或者 'ServerName' //参数ServerName为空时返回本机的MAC地址 //MAC地址以'XX-XX-XX-XX-XX-XX'的格式返回 // ======================================================================function GetMacAddress(const AServerName: string): string; type TNetTransportEnum = function(pszServer: PWideChar; Level: DWORD; var pbBuffer: pointer; PrefMaxLen: LongInt; var EntriesRead: DWORD; var TotalEntries: DWORD; var ResumeHandle: DWORD): DWORD; stdcall; TNetApiBufferFree = function(Buffer: pointer): DWORD; stdcall; PTransportInfo = ^TTransportInfo; TTransportInfo = record quality_of_service: DWORD; number_of_vcs: DWORD; transport_name: PWChar; transport_address: PWChar; wan_ish: boolean; end;var E, ResumeHandle, EntriesRead, TotalEntries: DWORD; FLibHandle: THandle; sMachineName, sMacAddr, Retvar: string; pBuffer: pointer; pInfo: PTransportInfo; FNetTransportEnum: TNetTransportEnum; FNetApiBufferFree: TNetApiBufferFree; pszServer: array[0..128] of WideChar; i, ii, iIdx: integer; begin sMachineName := trim(AServerName); Retvar := '00-00-00-00-00-00'; // Add leading \\ if missing if (sMachineName <> '') and (length(sMachineName) >= 2) then begin if copy(sMachineName, 1, 2) <> '\\' then sMachineName := '\\' + sMachineName end; // Setup and load from DLL pBuffer := nil; ResumeHandle := 0; FLibHandle := LoadLibrary('NETAPI32.DLL'); // Execute the external function if FLibHandle <> 0 then begin @FNetTransportEnum := GetProcAddress(FLibHandle, 'NetWkstaTransportEnum'); @FNetApiBufferFree := GetProcAddress(FLibHandle, 'NetApiBufferFree'); E := FNetTransportEnum(StringToWideChar(sMachineName, pszServer, 129), 0, pBuffer, -1, EntriesRead, TotalEntries, Resumehandle); if E = 0 then begin pInfo := pBuffer; // Enumerate all protocols - look for TCPIP for i := 1 to EntriesRead do begin if pos('TCPIP', UpperCase(pInfo^.transport_name)) <> 0 then begin // Got It - now format result 'xx-xx-xx-xx-xx-xx' iIdx := 1; sMacAddr := pInfo^.transport_address; for ii := 1 to 12 do begin Retvar[iIdx] := sMacAddr[ii]; inc(iIdx); if iIdx in [3, 6, 9, 12, 15] then inc(iIdx); end; end; inc(pInfo); end; if pBuffer <> nil then FNetApiBufferFree(pBuffer); end; try FreeLibrary(FLibHandle); except // 错误处理 end; end; result := Retvar; end;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ScktComp;type
TCon = record
FileName : String;
TotalSize : Integer;
Status : Integer;
end; PCON = ^TCON; TForm1 = class(TForm)
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
ClientSocket: TClientSocket;
ServerSocket: TServerSocket;
btnServerActive: TButton;
btnClientCon: TButton;
btnClientDisConn: TButton;
BtnClientSendF: TButton;
Memo1: TMemo;
OpenDialog: TOpenDialog;
Edit1: TEdit;
Label1: TLabel;
procedure btnClientConClick(Sender: TObject);
procedure btnClientDisConnClick(Sender: TObject);
procedure BtnClientSendFClick(Sender: TObject);
procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure btnServerActiveClick(Sender: TObject);
procedure ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}var Count : Integer;function GetFileSize(const FileName: string):integer;
var f : TFileStream;
begin
f := TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone);
Result :=f.Size;
F.Free;
end;procedure TForm1.btnClientConClick(Sender: TObject);
begin
ClientSocket.Active := True;
with OpenDialog do
begin
Execute;
if FileName <> '' then
begin
Edit1.Text := 'UPLOAD '+ ExtractFileName(FileName) +' '+Inttostr(GetFileSize(FileName));
Label1.Caption := FileName;
ClientSocket.Socket.SendText(edit1.Text);
end;
end;
end;procedure TForm1.btnClientDisConnClick(Sender: TObject);
begin
ClientSocket.Active := False;
end;procedure TForm1.BtnClientSendFClick(Sender: TObject);
var fs : TFileStream;
Buf : pointer;
begin
fs := TFileStream.Create(Label1.Caption ,fmOpenRead or fmShareDenyNone);
GetMem(Buf,fs.Size);
fs.Seek(0,soFromBeginning);
fs.ReadBuffer(Buf^,fs.Size);
memo1.Lines.Add('has send : '+inttostr(ClientSocket.Socket.SendBuf(Buf^,fs.Size)));
end;procedure TForm1.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.add(socket.ReceiveText);
end;procedure TForm1.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode := 0;
end;procedure TForm1.btnServerActiveClick(Sender: TObject);
begin
ServerSocket.Active := True;
end;procedure TForm1.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var c : pcon;
begin
c :=new(pcon);
c.FileName := '';
c.TotalSize := 0 ;
c.Status := 0;
Socket.Data := c;
Socket.SendText('已经连接,请输入UPLOAD FILENAME SIZE'#13#10);
end;procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var C : PCON;
cmd:String;
Buffer : pointer;
nRetr : integer;
fs : TFileStream;
const bufferSize = 1024 ;begin
C:= Socket.Data ;
case c.Status of
0 :
begin
cmd := trim(Socket.ReceiveText) ;
if Pos('UPLOAD ',uppercase(cmd)) > 0 then
begin
c.FileName := trim(Copy(cmd,Pos(' ',cmd)+1,Length(cmd)));
c.TotalSize := StrToInt(Copy(c.FileName,Pos(' ',c.FileName)+1,Length(c.FileName)));
c.FileName := trim(Copy(c.FileName,1,Pos(' ',c.FileName)));
c.Status := 1;
Socket.Data := C;
Socket.SendText('you can send File !'#13#10);
end;
end;
1 :
begin
Count := count + 1;
GetMem(Buffer,BufferSize);
nRetr := Socket.ReceiveBuf(Buffer^,BufferSize);
Memo1.Lines.Add(IntToStr(Count) + ' ' + IntToStr(nRetr));
if not FIleExists('c:\'+c.FileName) then
begin
fs :=TFileStream.Create('c:\'+c.FileName,fmCreate or fmShareDenyNone);
fs.Seek(0,soFromBeginning);
end
else
begin
fs :=TFileStream.Create('c:\'+c.FileName,fmOpenWrite or fmShareDenyNone);
fs.Seek(0,soFromEnd);
end;
fs.WriteBuffer(Buffer^,nRetr);
fs.Destroy;
FreeMem(Buffer);
end;
end;
end;procedure TForm1.ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode := 0;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Count := 0;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ClientSocket.Active := False;
ServerSocket.Active := False;
end;end.
怎么也需要在对方的计算机上运行个服务端或使用网上邻居下面的函数以'XX-XX-XX-XX-XX-XX' 的格式返回远程或本地机器的MAC地址。Function to return the MAC address of a remote or local machine in the format 'XX-XX-XX-XX-XX-XX' 返回的MAC地址是一个能用在多个方面的唯一标识。使用方法:
ShowMessage(GetMacAddress('\\MHEYDON');
输出'00-02-08-E7-99-6B'// ======================================================================
//返回值是主机AServerName的MAC地址
//AServerName参数的格式为'\\ServerName' 或者 'ServerName'
//参数ServerName为空时返回本机的MAC地址
//MAC地址以'XX-XX-XX-XX-XX-XX'的格式返回
// ======================================================================function GetMacAddress(const AServerName: string): string;
type
TNetTransportEnum = function(pszServer: PWideChar;
Level: DWORD;
var pbBuffer: pointer;
PrefMaxLen: LongInt;
var EntriesRead: DWORD;
var TotalEntries: DWORD;
var ResumeHandle: DWORD): DWORD; stdcall; TNetApiBufferFree = function(Buffer: pointer): DWORD; stdcall; PTransportInfo = ^TTransportInfo;
TTransportInfo = record
quality_of_service: DWORD;
number_of_vcs: DWORD;
transport_name: PWChar;
transport_address: PWChar;
wan_ish: boolean;
end;var
E, ResumeHandle,
EntriesRead,
TotalEntries: DWORD;
FLibHandle: THandle;
sMachineName,
sMacAddr,
Retvar: string;
pBuffer: pointer;
pInfo: PTransportInfo;
FNetTransportEnum: TNetTransportEnum;
FNetApiBufferFree: TNetApiBufferFree;
pszServer: array[0..128] of WideChar;
i, ii, iIdx: integer;
begin
sMachineName := trim(AServerName);
Retvar := '00-00-00-00-00-00'; // Add leading \\ if missing
if (sMachineName <> '') and (length(sMachineName) >= 2) then
begin
if copy(sMachineName, 1, 2) <> '\\' then
sMachineName := '\\' + sMachineName
end; // Setup and load from DLL
pBuffer := nil;
ResumeHandle := 0;
FLibHandle := LoadLibrary('NETAPI32.DLL'); // Execute the external function
if FLibHandle <> 0 then
begin
@FNetTransportEnum := GetProcAddress(FLibHandle, 'NetWkstaTransportEnum');
@FNetApiBufferFree := GetProcAddress(FLibHandle, 'NetApiBufferFree');
E := FNetTransportEnum(StringToWideChar(sMachineName, pszServer, 129), 0,
pBuffer, -1, EntriesRead, TotalEntries, Resumehandle); if E = 0 then
begin
pInfo := pBuffer; // Enumerate all protocols - look for TCPIP
for i := 1 to EntriesRead do
begin
if pos('TCPIP', UpperCase(pInfo^.transport_name)) <> 0 then
begin
// Got It - now format result 'xx-xx-xx-xx-xx-xx'
iIdx := 1;
sMacAddr := pInfo^.transport_address; for ii := 1 to 12 do
begin
Retvar[iIdx] := sMacAddr[ii];
inc(iIdx);
if iIdx in [3, 6, 9, 12, 15] then inc(iIdx);
end;
end; inc(pInfo);
end;
if pBuffer <> nil then FNetApiBufferFree(pBuffer);
end; try
FreeLibrary(FLibHandle);
except
// 错误处理
end;
end;
result := Retvar;
end;