当前位置: 首页 > news >正文

网络打印机的搜索与连接(一)

介绍

        网络打印机就是可以通过网络连接上的打印机,这类打印机分2种:自身具有互联网接入功能可以分配IP的打印机我们称为网络打印机、另外一种就是被某台电脑连接上去后通过共享的方式共享到网络里面的我们称为共享打印机。现在还有一种可以通过互联网连接的网络打印机,本篇文章暂时先不讲。下面将详细讲解上述2类打印机的搜索、连接。

网络打印机的搜索

        网络打印机可以通过2种协议搜索到

  • snmp协议:此协议适用于查询单个IP的网络打印机搜索。此协议会发送一个标准的snmp协议内容给目标ip地址(协议内容:".1.3.6.1.2.1.1.1.0"),如果该ip是某个网络打印机那么就会进行应答(回答内容:SNMPv2-MIB::sysDescr.0 = STRING: HP ETHERNET MULTI-ENVIRONMENT,SN:VNH3626885,FN:3K90LKC,SVCID:34305,PID:HP LaserJet MFP M227fdn)。 代码如下:
// 初始化SNMP库。
init_snmp("snmp_printer");struct snmp_session session;
struct snmp_session* sess_handle = nullptr;
struct snmp_pdu* pdu = nullptr;
struct snmp_pdu* response = nullptr;
struct variable_list* variables = nullptr;
oid id_oid[MAX_OID_LEN];
size_t id_len = MAX_OID_LEN;
int status;// 初始化会话
snmp_sess_init(&session);
session.peername = _strdup(peername);// 设置社区字符串
session.community = (u_char*)_strdup("public");
session.community_len = strlen((const char*)session.community);// 设置SNMP版本
session.version = SNMP_VERSION_2c;
session.timeout = 1000;
session.retries = 1;// 打开SNMP会话
sess_handle = snmp_open(&session);
if (!sess_handle) 
{snmp_perror("snmp_open");return;
}// 创建 PDU
pdu = snmp_pdu_create(SNMP_MSG_GET);
if (pdu == nullptr)
{return;
}read_objid(".1.3.6.1.2.1.1.1.0", id_oid, &id_len);
snmp_add_null_var(pdu, id_oid, id_len);// 发送 PDU
status = snmp_synch_response(sess_handle, pdu, &response);// 检查是否成功
if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR)
{// 处理变量列表for (variables = response->variables; variables; variables = variables->next_variable){snprint_variable(szPrinterInfo, nBuffSize, variables->name, variables->name_length, variables);}KLOG_INFO << "QueryPrinter SnmpGet: " << szPrinterInfo;
}
else 
{// 如果失败,则打印错误if (status == STAT_SUCCESS)fprintf(stderr, "Error in packet\nReason: %s\n",snmp_errstring(response->errstat));else if (status == STAT_TIMEOUT)fprintf(stderr, "Timeout: No response from %s.\n",session.peername);elsesnmp_sess_perror("snmpdemoapp", sess_handle);
}// 释放响应
if (response && pdu) {snmp_free_pdu(response);
}// 关闭会话
snmp_close(sess_handle);// 清理SNMP库。
snmp_shutdown("snmp_printer");
  • mDNS多播DNS协议来解析网络上设备的主机名到IP地址,而无需中央DNS服务器的网络服务协议。通过向固定IP和和固定端口5353发送不同的协议来接收应答这样的方式搜索打印机
    static int mdns_query_send(int sock, mdns_record_type_t type, const char* name, size_t length, void* buffer,size_t capacity, uint16_t query_id) 
{if (capacity < (17 + length))return -1;uint16_t rclass = MDNS_CLASS_IN | MDNS_UNICAST_RESPONSE;struct sockaddr_storage addr_storage;struct sockaddr* saddr = (struct sockaddr*)&addr_storage;socklen_t saddrlen = sizeof(addr_storage);if (getsockname(sock, saddr, &saddrlen) == 0) {if ((saddr->sa_family == AF_INET) &&(ntohs(((struct sockaddr_in*)saddr)->sin_port) == MDNS_PORT))rclass &= ~MDNS_UNICAST_RESPONSE;else if ((saddr->sa_family == AF_INET6) &&(ntohs(((struct sockaddr_in6*)saddr)->sin6_port) == MDNS_PORT))rclass &= ~MDNS_UNICAST_RESPONSE;}uint16_t* data = (uint16_t*)buffer;// Query ID*data++ = htons(query_id);// Flags*data++ = 0;// Questions*data++ = htons(1);// No answer, authority or additional RRs*data++ = 0;*data++ = 0;*data++ = 0;// Fill in question// Name stringdata = (uint16_t*)mdns_string_make(data, capacity - 17, name, length);if (!data)return -1;// Record type*data++ = htons(type);//! Optional unicast response based on local port, class IN*data++ = htons(rclass);ptrdiff_t tosend = (char*)data - (char*)buffer;if (mdns_multicast_send(sock, buffer, (size_t)tosend))return -1;return query_id;}static size_tmdns_query_recv(int sock, void* buffer, size_t capacity, mdns_record_callback_fn callback,void* user_data, int only_query_id) {struct sockaddr_in6 addr;struct sockaddr* saddr = (struct sockaddr*)&addr;socklen_t addrlen = sizeof(addr);memset(&addr, 0, sizeof(addr));int ret = recvfrom(sock, (char*)buffer, (mdns_size_t)capacity, 0, saddr, &addrlen);if (ret <= 0)return 0;size_t data_size = (size_t)ret;uint16_t* data = (uint16_t*)buffer;uint16_t query_id = ntohs(*data++);uint16_t flags = ntohs(*data++);uint16_t questions = ntohs(*data++);uint16_t answer_rrs = ntohs(*data++);uint16_t authority_rrs = ntohs(*data++);uint16_t additional_rrs = ntohs(*data++);(void)sizeof(flags);if ((only_query_id > 0) && (query_id != only_query_id))return 0;  // Not a reply to the wanted one-shot queryif (questions > 1)return 0;// Skip questions partint i;for (i = 0; i < questions; ++i) {size_t ofs = (size_t)((char*)data - (char*)buffer);if (!mdns_string_skip(buffer, data_size, &ofs))return 0;data = (uint16_t*)((char*)buffer + ofs);uint16_t rtype = ntohs(*data++);uint16_t rclass = ntohs(*data++);(void)sizeof(rtype);(void)sizeof(rclass);}size_t records = 0;size_t offset = MDNS_POINTER_DIFF(data, buffer);records += mdns_records_parse(sock, saddr, addrlen, buffer, data_size, &offset,MDNS_ENTRYTYPE_ANSWER, query_id, answer_rrs, callback, user_data);records +=mdns_records_parse(sock, saddr, addrlen, buffer, data_size, &offset,MDNS_ENTRYTYPE_AUTHORITY, query_id, authority_rrs, callback, user_data);records += mdns_records_parse(sock, saddr, addrlen, buffer, data_size, &offset,MDNS_ENTRYTYPE_ADDITIONAL, query_id, additional_rrs, callback,user_data);return records;}

共享打印机的搜索

        共享打印机的搜索其实是根据windows的远程登录原理来实现,首先利用Guest帐号登录远程系统,然后再遍历设备获取打印机。 代码如下:

void CSharedPrinter::SearchSharedPrinter(const char* szIpAddress, const char* szUser, const char* szPassword, bool bDefaultLogin, bool bNotifyUI)
{m_strSharedUser = szUser;m_strSharedPass = szPassword;std::wstring strIpAddress = cf::string::SysMultiByteToWide(szIpAddress, CP_ACP);std::wstring strUser = cf::string::SysMultiByteToWide(szUser, CP_ACP);std::wstring strPassword = cf::string::SysMultiByteToWide(szPassword, CP_ACP);wchar_t remote[MAX_PATH] = { 0 };_snwprintf_s(remote, MAX_PATH, L"\\\\%s\\IPC$", strIpAddress.c_str());USE_INFO_2 useInfo;ZeroMemory(&useInfo, sizeof(useInfo));useInfo.ui2_local = nullptr;useInfo.ui2_remote = remote;useInfo.ui2_username = (LPWSTR)strUser.c_str();useInfo.ui2_password = (LPWSTR)strPassword.c_str();useInfo.ui2_domainname = (LPWSTR)L"";useInfo.ui2_asg_type = USE_WILDCARD;int nRetry = 0;
LOGIN:// 建立连接nRetry++;DWORD dwResult;NET_API_STATUS nStatus = NetUseAdd(NULL, 2, (LPBYTE)&useInfo, &dwResult);if (nStatus != NERR_Success){if (bNotifyUI){if (OnLoginError(nStatus, szIpAddress, szUser, szPassword, bDefaultLogin)){// 修复重复,重试一次if (nRetry < 2 && !m_bStopAddressSearch){goto LOGIN;}}}return;}if (bNotifyUI){PrinterConnect data;data.nAction = 2;data.emPrinterType = PrinterType::share;data.nLoginResult = 1;KReportInfoC::reportPrinterConnect(data);}LPBYTE pBuf = nullptr;DWORD entriesRead = 0;DWORD totalEntries = 0;DWORD resumeHandle = 0;wchar_t remote2[MAX_PATH] = { 0 };_snwprintf_s(remote2, MAX_PATH, L"\\\\%s", strIpAddress.c_str());nStatus = NetShareEnum(remote2, 1, &pBuf, MAX_PREFERRED_LENGTH, &entriesRead, &totalEntries, &resumeHandle);if (nStatus == ERROR_SUCCESS || nStatus == ERROR_MORE_DATA){PSHARE_INFO_1 pShareInfo = reinterpret_cast<PSHARE_INFO_1>(pBuf);for (DWORD i = 0; i < entriesRead; i++){if (STYPE_PRINTQ == pShareInfo[i].shi1_type){auto strName = cf::string::SysWideToMultiByte(pShareInfo[i].shi1_netname, CP_UTF8);NetworkPrinter stPrinterInfo;strcpy_s(stPrinterInfo.szName, strName.c_str());strcpy_s(stPrinterInfo.szIPV4, szIpAddress);stPrinterInfo.bPrinter = true;NotifySearchResult(szIpAddress, stPrinterInfo, PRINTER_TYPE::PRINTER_SHARED, false);}}m_LoginInfo[szIpAddress] = std::make_pair(szUser,szPassword);}NetUseDel(nullptr, remote, USE_NOFORCE);if (pBuf != nullptr){NetApiBufferFree(pBuf);}
}

        

相关文章:

网络打印机的搜索与连接(一)

介绍 网络打印机就是可以通过网络连接上的打印机&#xff0c;这类打印机分2种&#xff1a;自身具有互联网接入功能可以分配IP的打印机我们称为网络打印机、另外一种就是被某台电脑连接上去后通过共享的方式共享到网络里面的我们称为共享打印机。现在还有一种可以通过互联网连接…...

LangChain + llamaFactory + Qwen2-7b-VL 构建本地RAG问答系统

单纯仅靠LLM会产生误导性的 “幻觉”&#xff0c;训练数据会过时&#xff0c;处理特定知识时效率不高&#xff0c;缺乏专业领域的深度洞察&#xff0c;同时在推理能力上也有所欠缺。 正是在这样的背景下&#xff0c;检索增强生成技术&#xff08;Retrieval-Augmented Generati…...

【自然语言处理(NLP)】介绍、发展史

文章目录 介绍发展史1. 规则驱动时期&#xff08;20世纪50年代-80年代&#xff09;技术特点标志性成果 2. 统计方法兴起&#xff08;1990年代-2000年代&#xff09;技术特点标志性成果 3. 神经网络复兴&#xff08;2010年代初至今&#xff09;技术特点标志性成果 4. 集成与应用…...

1.CSS的三大特性

css有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级 1.1 层叠性 想通选择器给设置想听的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要是解决样式冲突的问题。 <!DOCTYPE html> <html lang"en&…...

【分布式日志篇】从工具选型到实战部署:全面解析日志采集与管理路径

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

基于springcloud汽车信息分析与可视化系统

基于Spring Cloud的汽车信息分析与可视化系统是一款旨在整合、分析汽车相关数据并以直观可视化方式呈现的应用系统。 一、系统架构 该系统基于先进的Spring Cloud架构构建&#xff0c;充分利用其分布式、微服务特性&#xff0c;确保系统具备高可用性、可扩展性和灵活性。Spri…...

TOGAF之架构标准规范-信息系统架构 | 数据架构

TOGAF是工业级的企业架构标准规范&#xff0c;信息系统架构阶段是由数据架构阶段以及应用架构阶段构成&#xff0c;本文主要描述信息系统架构阶段中的数据架构阶段。 如上所示&#xff0c;信息系统架构&#xff08;Information Systems Architectures&#xff09;在TOGAF标准规…...

Databend x 沉浸式翻译 | 基于 Databend Cloud 构建高效低成本的业务数据分析体系

「沉浸式翻译」是一个非常流行的双语对照网页翻译扩展工具&#xff0c;用户可以用它来即时翻译外文网页、PDF 文档、ePub 电子书、字幕等。它不仅可以实现原文加译文实时双语对照显示&#xff0c;还支持 Google、OpenAI、DeepL、微软、Gemini、Claude 等数十家翻译平台服务的自…...

cuda的并行运算介绍

cuda是如何使用GPU并行运算的&#xff1a; 以一个函数为例&#xff1a; duplicateWithKeys << <(P 255) / 256, 256 >> > (P,geomState.means2D,geomState.depths,geomState.point_offsets,binningState.point_list_keys_unsorted,binningState.point_list_…...

「全网最细 + 实战源码案例」设计模式——抽象工厂模式

核心思想 抽象工厂模式是一种创建型设计模式&#xff0c;它提供一个接口&#xff0c;用于创建一系列相关或互相依赖的对象&#xff0c;而无需指定它们的具体类。抽象工厂模式解决了产品族的问题&#xff0c;可以管理和创建一组相关的产品。 结构 1. 抽象工厂 定义创建一些列…...

领域驱动设计(DDD)四 订单管理系统实践步骤

以下是基于 领域驱动设计&#xff08;DDD&#xff09; 的订单管理系统实践步骤&#xff0c;系统功能主要包括订单的创建、更新、查询和状态管理&#xff0c;采用 Spring Boot 框架进行实现。 1. 需求分析 订单管理系统的基本功能&#xff1a; 订单创建&#xff1a;用户下单创…...

leetcode 面试经典 150 题:简化路径

链接简化路径题序号71题型字符串解法栈难度中等熟练度✅✅✅ 题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 ‘/’ 开头&#xff09;&#xff0c;请你将其转化为 更加简洁的规范路径。 在 Unix 风格的文件系统中规则如下…...

基于 STM32 的智能农业温室控制系统设计

1. 引言 随着农业现代化的发展&#xff0c;智能农业温室控制系统对于提高农作物产量和质量具有重要意义。该系统能够实时监测温室内的环境参数&#xff0c;如温度、湿度、光照强度和土壤湿度等&#xff0c;并根据这些参数自动调节温室设备&#xff0c;如通风扇、加热器、加湿器…...

【Spring Boot】掌握 Spring 事务:隔离级别与传播机制解读与应用

前言 &#x1f31f;&#x1f31f;本期讲解关于spring 事务传播机制介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话…...

【Postgres_Python】使用python脚本将多个PG数据库合并为一个PG数据库

需要合并的多个PG数据库表个数和结构一致&#xff0c;这里提供一种思路&#xff0c;选择sql语句insert插入的方式进行&#xff0c;即将其他PG数据库的每个表内容插入到一个PG数据库中完成数据库合并 示例代码说明&#xff1a; 选择一个数据库导出表结构为.sql文件&#xff08…...

Tailwind CSS v4.0 发布

Holy shit its actually done &#xff01; 1 月 22 日&#xff0c;Tailwind CSS 正式发布了 4.0 版本&#xff0c;针对性能和灵活性进行了优化&#xff0c;重新构想了配置和定制体验&#xff0c;并充分利用了 Web 平台提供的最新进展。 新的高性能引擎- 完整构建速度提高 5 …...

pandas基础:文件的读取和写入

文件的读取和写入 读取csv文件 csv文件&#xff1a; name,age,city Alice,25,New York Bob,30,Los Angelesread_csv(filename) header&#xff1a;如 何处理文件的第一行。header0将第一行作为列名&#xff0c;headerNone表示文件中没有列名&#xff0c;所有行都是数据。 im…...

【MySQL — 数据库增删改查操作】深入解析MySQL的create insert 操作

数据库CRUD操作 1 CRUD简介 CURD是对数据库中的记录进行基本的增删改查操作: 2. Create 新增 语法 INSERT [INTO] table_name[(column [&#xff0c;column] ...)] VALUES(value_list)[&#xff0c;(value_list)] ... # value 后面的列的个数和类型&#xff0c;要和表结构匹配…...

每日OJ_牛客_小红的子串_滑动窗口+前缀和_C++_Java

目录 牛客_小红的子串_滑动窗口前缀和 题目解析 C代码 Java代码 牛客_小红的子串_滑动窗口前缀和 小红的子串 描述&#xff1a; 小红拿到了一个长度为nnn的字符串&#xff0c;她准备选取一段子串&#xff0c;满足该子串中字母的种类数量在[l,r]之间。小红想知道&…...

HTTP 配置与应用(局域网)

想做一个自己学习的有关的csdn账号&#xff0c;努力奋斗......会更新我计算机网络实验课程的所有内容&#xff0c;还有其他的学习知识^_^&#xff0c;为自己巩固一下所学知识&#xff0c;下次更新HTTP 配置与应用&#xff08;不同网段&#xff09;。 我是一个萌新小白&#xf…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...