当前位置: 代码迷 >> Delphi >> IdUDPServer透过哪个网卡发送数据
  详细解决方案

IdUDPServer透过哪个网卡发送数据

热度:4548   发布时间:2013-02-26 00:00:00.0
IdUDPServer通过哪个网卡发送数据?
跪求高人帮忙,
  请问:TIdUDPServer组件SendBuffer发送数据, 如果机子上有多个网卡,TIdUDPServer默认是哪个网卡发送出去的?(未设置TIdUDPServer.Bindings属性,TIdUDPServer.defaultPort=4002)
  
  我跟踪了Delphi7的源码 SendBuffer用的是Binding属性的SendTo方法,
  Binding属性是GetBinding(TIdUDPServer覆盖)方法实现
  GetBinding方法中FCurrentBinding := Bindings[0]; 
  哪位大侠可以告诉我有多个网卡时,未设置TIdUDPServer.Bindings属性,Bindings[0]会是哪个网卡?
  同时请问未设置TIdUDPServer.Bindings属性TIdUDPServer是监听所有网卡的4002端口吗?

附Delphi7部分源码:
procedure TIdUDPBase.SendBuffer(AHost: string; const APort: Integer; var ABuffer;
 const AByteCount: integer);
begin
  AHost := GStack.ResolveHost(AHost);
  Binding.SendTo(AHost, APort, ABuffer, AByteCount);
end;
property Binding: TIdSocketHandle read GetBinding;

function TIdUDPServer.GetBinding: TIdSocketHandle;
var
  i: integer;
begin
  if not Assigned(FCurrentBinding) then
  begin
    if Bindings.Count < 1 then begin
      Bindings.Add;
    end;
    for i := 0 to Bindings.Count - 1 do begin
      Bindings[i].AllocateSocket(Id_SOCK_DGRAM);
      Bindings[i].Bind;
    end;
    FCurrentBinding := Bindings[0];
    FListenerThread := TIdUDPListenerThread.Create(BufferSize, Self);
    FListenerThread.Start;
    BroadcastEnabledChanged;
  end;
  Result := FCurrentBinding;
end;

------解决方案--------------------------------------------------------
系统根据你发送的目的地址选择用哪块网卡,不过你可以通过bind指定地址,这有很多socket例子,你看看bind的用法:
http://download.csdn.net/detail/geoff08zhang/4571358
------解决方案--------------------------------------------------------
简单的回答:
客户端连接在哪张网卡就用那张发。因为ip 0.0.0.0是倾听所有。
如果 ip 是指定的, 那么哪张网卡的ip地址是跟你指定的ip地址是一样的, 就是那张网卡发。
例如你的ip是192.168.0.1, 那他绝对不会通过192.168.1.1的地址的网卡发。
  相关解决方案