Не желая украсть гром RRUZ, Я предлагаю следующий вариант, взятый из моей кодовой базы, с некоторыми наблюдениями. Я сделал это скорее как ответ, чем комментарий, чтобы включить код.
type
TMacAddress = array [0..5] of Byte;
function inet_addr(const IPAddress: string): ULONG;
begin
Result := ULONG(WinSock.inet_addr(PAnsiChar(AnsiString(IPAddress))));
end;
function SendARP(DestIP, SrcIP: ULONG; pMacAddr: Pointer; var PhyAddrLen: ULONG): DWORD; stdcall; external 'Iphlpapi.dll';
function GetMacAddress(const IPAddress: string): TMacAddress;
var
MaxMacAddrLen: ULONG;
begin
MaxMacAddrLen := SizeOf(Result);
if SendARP(inet_addr(IPAddress), 0, @Result, MaxMacAddrLen)<>NO_ERROR then begin
raise EMacAddressError.CreateFmt('Unable to do SendARP on address: ''%s''', [IPAddress]);
end;
end;
Существует несколько моментов.
Нет необходимости звонить WSAStartup/WSACleanup.
EDIT Как RRUZ указывает на комментарий, документация Winsock не освобождается Явно inet_addr от WSAStartup/WSACleanup поэтому я втягивать эту точку. В Vista проще просто вызвать RtlIpv4StringToAddress. Сказав все это, inet_addr настолько прост в реализации, что может быть проще свернуть самостоятельно.
Во-вторых, неверно объявление объявления inet_addr в WinSock.pas. Он объявляет возвращаемое значение типа u_long, которое определено в WinSock.pas как Longint. Это подписанное 4-байтовое целое число, но оно должно быть беззнаковым 4-байтовым целым, ULONG. Без явного броска вы можете получить ошибки диапазона.
Indy настолько дрянной, 10054 связан TCP. Между тем, у вас уже есть запись ARP для 10.0.0.1, используйте IP Helper API для опроса. –
Indy не так дерьмоват на самом деле, вам приходится обрабатывать исключения ... попробуйте ... кроме кого-нибудь ?! еще одна вещь, которую я недавно обнаружил, заключается в том, что даже если вы обрабатываете исключения, иногда исключение # 10054 все еще возникает, если у вас установлен журнал eureka, вы можете решить эту проблему, добавив EXCEPTION FILTER для ошибки EIdSocket или что-то в этом роде ... нет никаких исключений, все работает отлично !! – ComputerSaysNo
@ Dorin Duminica: 10054 означает, что агент-агент вызывается либо TCP RST, либо ICMP UNREACH. Во всяком случае, Indy использовал исключения для управления потоком, поэтому некоторые бессмысленные ошибки пузырьков для глубин Indy время от времени. –