我用WINSOCKET在局域网内传输文件;服务器端我用的函数是:
socket()
bind()
listen()
accept()
recv()/send()
closesocket()现在可以实现传输文件,但我不知怎样才可以得到客户端的IP及机器名,问题一:怎可以得到上面这些?问题二:对于listen(Server,5)//第二个参数,书上说是:
未真正完成连接前(尚未呼叫 accept() 前) 彼端的连接要求的最大个数
那么是不是说可以并发接收来自五个客户端的文件?先谢了.
socket()
bind()
listen()
accept()
recv()/send()
closesocket()现在可以实现传输文件,但我不知怎样才可以得到客户端的IP及机器名,问题一:怎可以得到上面这些?问题二:对于listen(Server,5)//第二个参数,书上说是:
未真正完成连接前(尚未呼叫 accept() 前) 彼端的连接要求的最大个数
那么是不是说可以并发接收来自五个客户端的文件?先谢了.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Winsock, Sockets, ComCtrls, Buttons,shellapi,ComObj,WinInet;type
TForm1 = class(TForm)
Label1: TLabel;
iplist: TComboBox;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
TreeView1: TTreeView;
TreeView2: TTreeView;
BitBtn1: TBitBtn;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
function GetLocalName():string;
function GetLocalIP():string;
procedure GetComputerInGroupName();
procedure GetGroupName();
procedure TreeView1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure TreeView2Click(Sender: TObject);
private
{ Private declarations }
public { Public declarations }
end;
type
TNetResourceArray = ^TNetResource;//网络类型的数组var
Form1: TForm1;
strr:string;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
txts:String;
dd:phostent;
sip:string;
begin
dd:=GetHostByName(pchar(iplist.Items[iplist.ItemIndex]));
with dd^ do
sIP := Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]), Byte(h_addr^[3])]); txts:='net.exe send '+ sip +' '+memo1.Text;
showmessage(txts); //可以是 计算机名或地址
winexec(pchar(txts),sw_hide);
showmessage('很好,发送成功!');
memo1.Lines.SaveToFile('.\meslist.txt');
end;procedure TForm1.FormCreate(Sender: TObject);
begin
GetGroupName();
end; function tform1.GetLocalIP ():string; //»ñÈ¡±¾µØipµØÖ·£»
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array [0..63] of char;
I : Integer;
GInitData : TWSADATA;begin
WSAStartup($101, GInitData);
Result := '';
GetHostName(Buffer, SizeOf(Buffer));
phe :=GetHostByName(buffer);
if phe = nil then Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
I := 0;
while pptr^[I] <> nil do
begin
result:=StrPas(inet_ntoa(pptr^[I]^));
Inc(I);
end;
WSACleanup;
end;function tform1.GetLocalName ():string;//»ñÈ¡±¾µØÖ÷»úÃû£»
var
pComputerName:pchar ;
ComputerNameLen:longword;
begin
ComputerNameLen:=255;
GetMem(pComputerName,ComputerNameLen);
try
if not GetComputerName(pComputerName,ComputerNameLen) then
pComputerName:='No computer name';
result:=pComputerName;
finally
FreeMem(pComputerName);
End;
end;procedure tform1.GetGroupName();
var
NetResource: TNetResource;
Buf: Pointer;
Node: TtreeNode;
Count, BufSize, Res: DWORD;
lphEnum: THandle;
p: TNetResourceArray;
i, j: SmallInt;
NetworkTypeList: TList;
my_node_1: Ttreenode;
begin
screen.Cursor := crHourGlass;
Node :=TreeView1.Selected;
NetworkTypeList := TList.Create;
//获取整个网络中的文件资源的句柄,lphEnum为返回名柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, nil, lphEnum);
if Res <> NO_ERROR then exit; //执行失败
//获取整个网络中的网络类型信息
Count := $FFFFFFFF; //不限资源数目
BufSize := 8192; //缓冲区大小设置为8K
GetMem(Buf, BufSize); //申请内存,用于获取工作组信息
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
if (Res = ERROR_NO_MORE_ITEMS) //资源列举完毕
or (Res <> NO_ERROR) //执行失败
then Exit;
P := TNetResourceArray(Buf);
for I := 0 to Count - 1 do //记录各个网络类型的信息
begin
NetworkTypeList.Add(p);
Inc(P);
end;
//WNetCloseEnum关闭一个列举句柄
Res := WNetCloseEnum(lphEnum); //关闭一次列举
if Res <> NO_ERROR then exit; for J := 0 to NetworkTypeList.Count - 1 do //列出各个网络类型中的所有工作组名称
begin //列出一个网络类型中的所有工作组名称
NetResource := TNetResource(NetworkTypeList.Items[J]^); //网络类型信息
//获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);
if Res <> NO_ERROR then break; //执行失败 while true do //列举一个网络类型的所有工作组的信息
begin
Count := $FFFFFFFF; //不限资源数目
BufSize := 8192; //缓冲区大小设置为8K
GetMem(Buf, BufSize); //申请内存,用于获取工作组信息
//获取一个网络类型的文件资源信息,
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
if (Res = ERROR_NO_MORE_ITEMS) //资源列举完毕
or (Res <> NO_ERROR) //执行失败
then break;
P := TNetResourceArray(Buf);
for I := 0 to Count - 1 do //列举各个工作组的信息
begin
my_node_1 := treeview1.Items.addchild(node, StrPAS(P^.lpRemoteName)); //取得一个工作组的名称
my_node_1.imageindex := 1;
Inc(P);
end;
end;
Res := WNetCloseEnum(lphEnum); //关闭一次列举
if Res <> NO_ERROR then break; //执行失败
end;
FreeMem(Buf);
NetworkTypeList.Destroy;
screen.Cursor := crDefault;
end;//获取计算机名
procedure tform1.GetComputerInGroupName();
var
NetResource: TNetResource;
Buf: Pointer;
Count, BufSize, Res: DWord;
Ind: Integer;
lphEnum: THandle;
Temp: TNetResourceArray;
groupname: string;
my_node: Ttreenode;
my_node_2: Ttreenode;
begin
screen.Cursor := crHourGlass;
my_node := treeview2.Selected;
groupname:= treeview1.Selected.text;
FillChar(NetResource, SizeOf(NetResource), 0); //初始化网络层次信息
NetResource.lpRemoteName := @GroupName[1]; //指定工作组名称
NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER; //类型为服务器(工作组)
NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;
NetResource.dwScope := RESOURCETYPE_DISK; //列举文件资源信息
//获取指定工作组的网络资源句柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum); if Res <> NO_ERROR then Exit; //执行失败
while True do //列举指定工作组的网络资源
begin
Count := $FFFFFFFF; //不限资源数目
BufSize := 8192; //缓冲区大小设置为8K
GetMem(Buf, BufSize); //申请内存,用于获取工作组信息
//获取计算机名称
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize); if Res = ERROR_NO_MORE_ITEMS then break; //资源列举完毕
if (Res <> NO_ERROR) then Exit; //执行失败
Temp := TNetResourceArray(Buf); for Ind := 0 to Count - 1 do //列举工作组的计算机名称
begin
//获取工作组的计算机名称,+2表示删除"\\",如\\wangfajun=>wangfajun
my_node_2 := treeview2.Items.AddChild(my_node, Temp^.lpRemoteName + 2);
my_node_2.imageindex := 2;
Inc(Temp);
end;
end;
Res := WNetCloseEnum(lphEnum); //关闭一次列举
if Res <> NO_ERROR then exit; //执行失败
FreeMem(Buf);
screen.Cursor := crDefault;
end;
procedure TForm1.TreeView1Click(Sender: TObject);
begin
GetComputerInGroupName();
end;procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;procedure TForm1.TreeView2Click(Sender: TObject);
begin
iplist.AddItem(treeview2.Selected.Text ,self);
iplist.ItemIndex :=0;
end;end.
对于2,可不可以举个例子?
var
wVersionRequested : WORD;
wsaData : TWSAData;
p : PHostEnt;
s : array[0..128] of char;
p2 : pchar;
begin
{启动 WinSock}
wVersionRequested := MAKEWORD(1, 1);
WSAStartup(wVersionRequested, wsaData);{计算机名}
GetHostName(@s, 128);
p := GetHostByName(@s);
HostName := p^.h_Name;{IP地址}
p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
HostIP := p2; WSACleanup;
end;
参数是:var HostName, HostIP: string而过程好是ShowHostName,不懂怎用,真不好意思
var
ip,host: string;
begin
...... ShowHostName(host,ip);......
end;