2009-10-19 4 views
5

Làm cách nào để có địa chỉ IP của máy in mạng được đặt tên cổng, bằng cách sử dụng API win32?Làm thế nào tôi có thể nhận địa chỉ IP của máy in mạng được đặt tên cổng bằng API Win32?

Tôi đã thử xem xét PRINTER_INFO_* structs, nhưng có vẻ như nó không xuất hiện ở đó.

+0

Điều này có khả thi không? Làm thế nào bạn có thể nhận được nó chỉ với số cổng. – Shoban

+1

Câu hỏi hay - có lẽ rõ ràng hơn với ý nghĩa của tên cổng? – Elemental

+2

@Shoban: Không phải số cổng nhưng tên cổng. @Elemental: tên cổng là thứ bạn cần cung cấp trong khi định cấu hình cổng máy in trong "Máy in và Fax". Bạn có thể lấy tên cổng của tất cả các máy in bằng cách sử dụng :: EnumPrinter win32 API –

Trả lời

2

Tôi không nghĩ có cách tiêu chuẩn để nhận địa chỉ IP. Có lẽ các triển khai không tương thích khác nhau của màn hình cổng mạng. Đối với máy in mạng của tôi, địa chỉ IP là một phần của tên cổng (ví dụ: IP_192_168.1.104). Nếu nó thuộc dạng đó, thì bạn có thể phân tích nó ra, nhưng tôi không nghĩ nó là phổ quát.

Sử dụng EnumPorts bạn có thể xác định xem đó có phải là máy in mạng hay không nhưng tôi vẫn không thấy cách nhận địa chỉ IP.

+0

Tên cổng có thể được chỉnh sửa sau khi được tạo, không có gì đảm bảo rằng "IP_192_168.1.104" thực sự là 192.168.1.104. Bạn có thể lấy địa chỉ IP cho tên cổng thông qua WMI với truy vấn WQL của "Chọn tên, HostAddress từ Win32_TCPIPPrinterPort" –

+1

Như Adrian nói không có cách nào để có được điều này thông qua các API. Các phương tiện duy nhất là bằng cách đọc sổ đăng ký trên máy chủ in theo khóa: HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Control \ Print \ Màn hình \ Cổng TCP/IP chuẩn \ Cổng –

2

Giống như bất kỳ thiết bị mạng IP nào khác, máy in sẽ có địa chỉ IP (biểu thị thẻ ethernet) và sẽ chạy dịch vụ trên một cổng nhất định (xác định chương trình phản hồi với thông báo máy in). Đây chỉ là công cụ mạng và không có gì để làm với các công cụ cụ thể của máy in.

Vì vậy, cho nó là cổng duy nhất, không có cách nào để tìm địa chỉ IP của nó. Có lẽ các dịch vụ trên tất cả các máy in khác đều lắng nghe cùng một cổng.

Giả sử bạn có nghĩa là bạn có tên máy in, bạn cần truy vấn dịch vụ tên cho tên miền của mình. Dịch vụ này ánh xạ các địa chỉ mạng tới các tên 'biểu tượng'.

Sử dụng winsock2 api, tôi tin rằng đó là gethostbyname bạn cần. Thao tác này sẽ truy xuất thông tin máy chủ của máy in của bạn bằng tên của máy in.

+1

Có nhiều ý nghĩa đối với từ 'cổng' trong ngữ cảnh của câu hỏi này. Tôi không nghĩ rằng áp phích đề cập đến cổng mà dịch vụ của máy in đang lắng nghe. Windows theo dõi máy in theo tên và cổng (ví dụ: cổng có thể là 'LPT1:'). Trong các phiên bản mới hơn của API, tên cổng hiếm khi cần thiết. –

0

Đơn giản chỉ cần sử dụng các API Advanced Printer, năng động gọi

3

bạn có thể lấy tên cổng bởi PRINTER_INFO_2, và nhận được ip từ registry, con đường là: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Print \ Màn hình \ Cổng TCP/IP chuẩn \ Ports cửa hàng ip trong "Tên máy chủ"