发现多个 USB-IrDA 设备,打开并连接每个设备的套接字

2024-03-02

对于任何优秀的套接字程序员:
是否可以使用套接字枚举通过 USB 端口连接到 PC 的多个活动 IrDA 设备?
如果是这样,怎么办?这确实是我的主要问题。帖子的其余部分完善了细节并描述了我所尝试的内容。

我正在使用 Microsoft SDK 和 ANSI C 编译器在 Windows 7 上开发应用程序。 应用程序设计要求它检测范围内的任何 IrDA 设备,使用套接字连接,并通过多个 IrDA 加密狗(每个设备一个加密狗)与多个设备通信,每个加密狗通过 USB 连接到 PC。注意:应避免使用虚拟 COM 端口。

我已成功使用套接字调用枚举,创建套接字,连接到单个 IrDA 设备并进行通信。这效果很好。
但是,我不确定如何设置代码以成功枚举多个 IrDA 设备。

到目前为止,我一次只能连接到一台设备。尽管 Windows 显然是"发现"三个 IrDA 适配器,如下图所示 - 总体场景(第 1 张图)、设备管理器(第 2 幅图)、设备属性(第 3 幅图):

Illustration 1: Overall scenario:
enter image description here

Illustration 2: From Device Manager:
enter image description here

Illustration 3: Properties of each 'found' IrDA device
(second two arrows are included to show Port-Hub address of all three devices) enter image description here

我正在使用的简单场景:
(部分变量名与上面场景描述不同,但在代码中是一致的)

1st- 我将两个有源 IrDA 设备放在两个加密狗前面(相距几英尺,因此两个设备之间没有信号模糊性),为了保持简单,现在仅使用 2 个。

2nd- 我创建 2 个 IrDA 套接字,使用以下方法获取两个句柄:socket(AF_IRDA, SOCK_STREAM, 0);

3rd- 我打电话:

if ((errorCode = getsockopt(gSocketHandle[0],
                 SOL_IRLMP,
                 IRLMP_ENUMDEVICES,
                 (char*)pDeviceList,
                 &deviceListLength)) == SOCKET_ERROR)  

4th- 然后我用 pDeviceList 中的新信息填充 destinIrdaDeviceAddr 并

    memcpy(&destinIrdaDeviceAddr.irdaDeviceID[0], &pDevList->Device[0].irdaDeviceID[0], 4);

5th - call:

connect(gSocketHandle[0],(const struct sockaddr*)&destinIrdaDeviceAddr,(int) sizeof(SOCKADDR_IRDA))

此调用完成后,我使用下一个套接字句柄 (gSocketHandle1 https://i.stack.imgur.com/ZpDty.gif)。但我没有获得另一个枚举设备,而是获得了相同的设备。第二次调用在 pDeviceList 中产生与第一个设备中相同的信息。换句话说,我只枚举一个设备。

以下是尝试枚举两个 IrDA 设备的代码:

    // adapted from http://msdn.microsoft.com/en-us/library/windows/desktop/ms691754(v=vs.85).aspx

    #include <windows.h>
    #include <winsock2.h>
    #include <ansi_c.h>
    #include <af_irda.h>

    #pragma comment(lib, "ws2_32.lib")

    #define DEVICE_LIST_LEN 5
    #define MAX_RETRIES 10

    SOCKET conn1, conn2;

    char* iGetLastErrorText(DWORD nErrorCode);

    void main()
    {
        WSADATA         wsaData;
        // discovery buffer
        BYTE          DevListBuff[sizeof(DEVICELIST) - sizeof(IRDA_DEVICE_INFO) + 
                      (sizeof(IRDA_DEVICE_INFO) * DEVICE_LIST_LEN)];
        int           DevListLen = sizeof(DevListBuff);
        PDEVICELIST   pDevList   = (PDEVICELIST) &DevListBuff;
        int           DevNum, i;

        if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
        {
        printf("IR-Client: Unable to load the Winsock library!\n");
            getchar();
        }
        else printf("IR-Client: Winsock library 2.2 loaded!\n");

        SOCKADDR_IRDA DstAddrIR = { AF_IRDA, 0, 0, 0, 0, "IrDA:IrCOMM" };

        //Create socket handles
        if ((conn1 = socket(AF_IRDA, SOCK_STREAM, 0)) == INVALID_SOCKET)
        {
        // WSAGetLastError
        }
        if ((conn2 = socket(AF_IRDA, SOCK_STREAM, 0)) == INVALID_SOCKET)
        {
        // WSAGetLastError
        }

        /////////////////////////
        //enumerate devices - socket conn1
        /////////////////////////
        // search for the peer device
        pDevList->numDevice = 0;
        if (getsockopt(conn1, SOL_IRLMP, IRLMP_ENUMDEVICES, (CHAR *) pDevList, &DevListLen)
        == SOCKET_ERROR)
        {
        // WSAGetLastError
        }

        if (pDevList->numDevice == 0)
        {
        printf("no devices found\n");
        }

        // assume first device, we should have a common dialog here
        memcpy(&DstAddrIR.irdaDeviceID[0], &pDevList->Device[0].irdaDeviceID[0], 4);
        printf("%x\n", &DstAddrIR.irdaDeviceID[0]);


        // nothing special for IrCOMM from now on...
        if (connect(conn1, (const struct sockaddr *) &DstAddrIR, sizeof(SOCKADDR_IRDA)) 
        == SOCKET_ERROR)
        {
        // WSAGetLastError
        }

        /////////////////////////
        //enumerate devices - socket conn2
        /////////////////////////
        // search for the peer device
        pDevList->numDevice = 0;

        if (getsockopt(conn2, SOL_IRLMP, IRLMP_ENUMDEVICES, (CHAR *) pDevList, &DevListLen) == SOCKET_ERROR)
        {
        // WSAGetLastError
        }

        if (pDevList->numDevice == 0)
        {
        printf("no devices found\n");
        }

        // assume first device, we should have a common dialog here
        memcpy(&DstAddrIR.irdaDeviceID[0], &pDevList->Device[0].irdaDeviceID[0], 4);
        printf("%x\n", &DstAddrIR.irdaDeviceID[0]);

        // nothing special for IrCOMM from now on...
        if (connect(conn2, (const struct sockaddr *) &DstAddrIR, sizeof(SOCKADDR_IRDA)) 
        == SOCKET_ERROR)
        {
        // WSAGetLastError
        }
        getchar(); //to view irdaDeviceID
    }

    char* iGetLastErrorText(DWORD nErrorCode)
    {
        char* msg;
        // Ask Windows to prepare a standard message for a GetLastError() code:
        FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, nErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&msg, 0, NULL);
        // Return the message
        if (!msg)
        return("Unknown error");
        else
        return(msg);
    }

The following image shows values for ->irdaDeviceID[0]. Both values are the same indicating only one device was enumerated.
enter image description here


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

发现多个 USB-IrDA 设备,打开并连接每个设备的套接字 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现

随机推荐