发现多个USB-IrDA设备,打开并连接每个插槽

对于任何好的套接字程序员:
是否可以使用套接字通过USB端口枚举连接到PC的多个活动IrDA设备?
如果是这样,怎么样? 这是我的主要问题。 该post的其余部分详细说明了我所尝试的内容。

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

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

到目前为止,我一次只能连接到一个设备。 即使很明显Windows正在发现三个IrDA加密狗,如下图所示 – 整体情景(第一张图片),设备管理器(第二张图片),设备属性(第三张图片):

图1:总体情况:
在此处输入图像描述

图2:从设备管理器:
在此处输入图像描述

图3:每个“找到的”IrDA设备的属性
(包含后两个箭头以显示所有三个设备的Port-Hub地址) 在此处输入图像描述

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

第一个 – 我将两个有效的IrDA设备放在两个加密狗的前面(由几英尺隔开,因此两个设备之间没有信号模糊)现在只使用2来保持简单。

第二 – 我创建了2个IrDA套接字,使用两个句柄:socket(AF_IRDA,SOCK_STREAM,0);

3号 – 我打电话:

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

4 – 然后我用pDeviceList和中的新信息填充destinIrdaDeviceAddr

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

5号 – 致电:

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

在此调用完成后,我使用下一个套接字句柄(gSocketHandle 1 )重复(步骤3)。 但是,我没有获得另一个枚举设备,而是获得相同的设备。 第二次调用在pDeviceList中产生与第一个设备中相同的信息。 换句话说,我只是枚举一个设备。

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

  // adapted from http://msdn.microsoft.com/en-us/library/windows/desktop/ms691754(v=vs.85).aspx #include  #include  #include  #include  #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); } 

下图显示了 – > irdaDeviceID [0]的值。 两个值都相同,表示只枚举了一个设备。
在此处输入图像描述