Không có nhu cầu ăn cắp sấm sét của RRUZ, Tôi cung cấp các biến thể sau đây, lấy từ codebase của tôi, với một số quan sát Tôi đã làm điều này như là một câu trả lời chứ không phải là một bình luận để bao gồm mã số
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;
Có một vài điểm cần thực hiện.
Không cần phải gọi WSAStartup/WSACleanup.
EDIT Vì RRUZ chỉ ra trong nhận xét, tài liệu winsock không được miễn inet_addr từ WSAStartup/WSACleanup nên tôi rút lại điểm này. Trên Vista nó đơn giản hơn chỉ để gọi RtlIpv4StringToAddress. Có nói tất cả điều đó, inet_addr là dễ dàng như vậy để thực hiện nó chỉ có thể được dễ dàng hơn để cuộn của riêng bạn.
Thứ hai, việc khai báo inet_addr trong WinSock.pas là không chính xác. Nó khai báo giá trị trả về là một kiểu u_long được định nghĩa trong WinSock.pas là Longint. Đây là một số nguyên 4 byte đã ký nhưng nó phải là một số nguyên 4 byte không dấu, ULONG. Nếu không có diễn viên rõ ràng, bạn có thể gặp lỗi phạm vi.
Nguồn
2010-12-29 14:41:07
Indy quá crappy, 10054 là TCP liên quan. Trong khi đó, bạn đã có bản ghi ARP cho 10.0.0.1, hãy sử dụng API trình trợ giúp IP để thẩm vấn. –
Indy không phải là quá crappy thực sự, bạn phải xử lý ngoại lệ ... thử ... ngoại trừ bất cứ ai ?! một điều khác mà tôi vừa mới phát hiện ra là ngay cả tho 'bạn xử lý ngoại lệ, đôi khi ngoại lệ # 10054 vẫn được nâng lên NẾU bạn đã cài đặt nhật ký eureka, bạn có thể giải quyết vấn đề này bằng cách thêm LỌC EXCEPTION cho lỗi EIdSocket hoặc thứ gì đó tương tự ... không có ngoại lệ, mọi thứ hoạt động hoàn hảo !! – ComputerSaysNo
@Dorin Duminica: 10054 có nghĩa là máy chủ lưu trữ đại lý nào đã được thử lại với TCP RST hoặc ICMP UNREACH. Dù sao, Indy được sử dụng để sử dụng ngoại lệ cho kiểm soát dòng chảy, đó là lý do tại sao một số lỗi vô nghĩa bong bóng cho độ sâu của Indy thời gian để thời gian. –