如何根据端口名称获取网络打印机的IP地址, 使用win32 API?
我试着调查PRINTER_INFO_* structs
,但似乎不存在。
答案 0 :(得分:3)
您可以通过PRINTER_INFO_2获取端口名称,并从注册表获取IP,路径为: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Print \ Monitors \ Standard TCP / IP Port \ Ports “HostName”中的ip商店
答案 1 :(得分:2)
与任何其他IP网络设备一样,打印机将具有IP地址(表示其以太网卡),并将在某个端口上运行服务(识别响应打印机消息的程序)。这只是网络的东西,与打印机特定的东西没有任何关系。
所以鉴于它只是端口,没有办法找到它的IP地址。可能所有其他打印机上的服务都听同一个端口。
假设您的意思是拥有打印机的名称,则需要查询域名称服务。此服务将网络地址映射为“符号”名称。
使用winsock2 api,我相信你需要gethostbyname
。这将按名称检索打印机的主机信息。
答案 2 :(得分:2)
我认为没有一种获取IP地址的标准方法。网络端口监视器可能存在不同的不兼容实现。对于我的网络打印机,IP地址是端口名称的一部分(例如,IP_192_168.1.104
)。如果它是那种形式,那么你可以解析它,但我不认为这是普遍的。
使用EnumPorts
您可以确定它是否是网络打印机,但我仍然看不到获取IP地址的方法。
答案 3 :(得分:0)
只需使用高级打印机api,动态调用
答案 4 :(得分:0)
我来寻找答案,但我并没有真正接受没有办法,而是发现确实存在。这个答案在Delphi中,但是很简单:
def consumeRows(rowsFut: Future[Option[(Row,Future[_])]]): Unit = {
rowsFut.foreach {
_.foreach {
case (row: Row, nextRowsFut: Future[Option[(Row,Future[_])]]) =>
// Do something with row
println(row)
consumeRows(nextRowsFut)
}
}
val rowsFut = ask(foo, Bar())(1 seconds).mapTo[Option[(Row,Future[_])]]
consumeRows(rowsFut)