跪求高人帮忙,
请问: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的地址的网卡发。