我用WINSOCKET在局域网内传输文件;服务器端我用的函数是:
socket()
bind()
listen()
accept()
recv()/send()
closesocket()现在可以实现传输文件,但我不知怎样才可以得到客户端的IP及机器名,问题一:怎可以得到上面这些?问题二:对于listen(Server,5)//第二个参数,书上说是:
未真正完成连接前(尚未呼叫 accept() 前) 彼端的连接要求的最大个数 
那么是不是说可以并发接收来自五个客户端的文件?先谢了.

解决方案 »

  1.   

    //显示所有,再现的局域网计算机名,和ip
    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;//&raquo;&ntilde;&Egrave;&iexcl;±&frac34;&micro;&Oslash;&Ouml;÷&raquo;ú&Atilde;&ucirc;&pound;&raquo;
    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.   

    记得有一可以SERVERSOCKET.CONNECTIONS[0].REMOTEHOST
      

  3.   

    yq3woaini(哈哈镜(初级代码工)(★★★)):收到,谢谢.
      

  4.   

    哈哈,看来搞错了,并没有收到[email protected]的邮件.
      

  5.   

    简单办法:  Socket.Connection[i].RemoteHost比较中庸的方法:1.客户端取得Ip和机器名  2.利用连接,传回Server端
      

  6.   

    einsteincao(至尊宝) ( ):比较中庸的方法:1.客户端取得Ip和机器名  2.利用连接,传回Server端
    对于2,可不可以举个例子?
      

  7.   

    老大,能否给我一份传送文件的列子呀,谢谢。[email protected]
      

  8.   

    procedure  ShowHostName(var HostName, HostIP: string);
    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;
      

  9.   

    楼上:恕我是新手问一句,你这过程怎用?
    参数是:var HostName, HostIP: string而过程好是ShowHostName,不懂怎用,真不好意思
      

  10.   

    procedure TfrmLogin.BitBtn1Click(Sender: TObject);
    var
      ip,host: string;
    begin
    ......  ShowHostName(host,ip);......
    end;
      

  11.   

    先看看var声明的参数是什么意思按照上面方法调用