发现多个 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 设备,打开并连接每个设备的套接字 的相关文章

  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File

随机推荐