2010-05-18 465 views
2

我正在开发一个DLL在visual-C++的客户端应用程序通过蓝牙连接我的电脑到我的android手机。我用这个功能来找到在手机上我的蓝牙服务(见注释代码!):蓝牙winsock错误10049连接()

bool BlueRayXVR::findPairedService(GUID* guid, _SOCKET_ADDRESS* ret){ 
    this->checkStartup(); 

    HBLUETOOTH_DEVICE_FIND found_devices; 

    BLUETOOTH_DEVICE_INFO device_info; 
    device_info.dwSize = sizeof(device_info); 

    BLUETOOTH_DEVICE_SEARCH_PARAMS search_criteria; 
    search_criteria.dwSize = sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS); 
    search_criteria.fReturnAuthenticated = TRUE; 
    search_criteria.fReturnRemembered = FALSE; 
    search_criteria.fReturnConnected = FALSE; 
    search_criteria.fReturnUnknown = FALSE; 
    search_criteria.fIssueInquiry = FALSE; 
    search_criteria.cTimeoutMultiplier = 0; 

    found_devices = BluetoothFindFirstDevice(&search_criteria, &device_info); 

    if (found_devices == NULL) 
    { 
     _tprintf(TEXT("Error: \n%s\n"), getErrorMessage(WSAGetLastError(), error)); 
     return false; 
    } 

    WSAQUERYSET querySet; 
    memset(&querySet, 0, sizeof(querySet)); 
    querySet.dwSize = sizeof(querySet); 
    querySet.lpServiceClassId = guid; 
    querySet.dwNameSpace = NS_BTH; 

    SOCKADDR_BTH sab; 
    memset (&sab, 0, sizeof(sab)); 
    sab.addressFamily = AF_BTH; 

    char addressAsString[1000]; 
    DWORD addressSize = sizeof(addressAsString); 

    bool found = false; 

    do 
    { 
     sab.btAddr = device_info.Address.ullLong; 
     if (0 != WSAAddressToString((LPSOCKADDR)&sab, sizeof(sab), NULL, (LPWSTR)addressAsString, &addressSize)){ 
      _tprintf(TEXT("Error get the mac of the device %s\n.Going to the next device."), device_info.szName); 
     } 
     else{ 
      _tprintf(TEXT("Check on device %s%s for the service.\n"), device_info.szName, addressAsString); 
      querySet.lpszContext =(LPWSTR) addressAsString; 
      HANDLE service_lookup_handle; 
      DWORD flags = LUP_FLUSHCACHE |LUP_RETURN_NAME | LUP_RETURN_ADDR | LUP_RETURN_BLOB; 

      int result = WSALookupServiceBegin(&querySet, flags, &service_lookup_handle); 

      if (0 == result) 
      { 
       BYTE buffer[2000]; 
       DWORD bufferLength = sizeof(buffer); 
       WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer; 
       if(0 == WSALookupServiceNext(service_lookup_handle, flags, &bufferLength, pResults)) 
       { 
        _tprintf(TEXT("Service : %s\n"), pResults->lpszServiceInstanceName); 
        _tprintf(TEXT("Comment : %s\n"), pResults->lpszComment); 
        *ret = pResults->lpcsaBuffer->RemoteAddr; 
        found = true; 

       /* this->sock = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);      
        if (0 == ::connect(sock, ret->lpSockaddr, ret->iSockaddrLength)) 
        { 
         printf("connected"); 
         //closesocket (*sock); 
         //return TRUE; 
        } 
        wprintf(L"errore %d: %s", WSAGetLastError(), this->getErrorMessage(WSAGetLastError(), this->error)); 
        */ 
       } 
       result = WSALookupServiceEnd(service_lookup_handle); 
      } 
      else 
       _tprintf(TEXT("%s\nGoing to the next device..\n"), getErrorMessage(GetLastError(), error)); 
     } 
    } while (BluetoothFindNextDevice(found_devices, &device_info) && !found); 

    if(found_devices) 
     BluetoothFindDeviceClose(found_devices); 

    _tprintf(TEXT("No more device.\n")); 
    return found; 
} 

这一个连接到电话:

bool BlueRayXVR::connect(_SOCKET_ADDRESS* host) 
{ 
    this->sock = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM); 
    if (this->sock == INVALID_SOCKET) 
    { 
     _tprintf(TEXT("Failed to get bluetooth socket! %s\n"), getErrorMessage(WSAGetLastError(), error)); 
     exit(1); 
    } 

    if (0 == ::connect(sock, host->lpSockaddr, host->iSockaddrLength)) 
    { 
     printf("connected\n"); 
     return TRUE; 
    } 
    wprintf(L"errore %d: %s", WSAGetLastError(), this->getErrorMessage(WSAGetLastError(), this->error)); 
    return FALSE; 
} 

在我的测试控制台应用程序,我做的:

 _SOCKET_ADDRESS address; 
    memset (&address, 0, sizeof(address)); 
    if(blue->findPairedService(&blue->getDefaultGUID4XVR(), &address)){ 
     printf("service founded..try to connect..\n"); 
     if(blue->connect(&address)) 
      blue->read(); 
    } 

的问题是,如果我跑我的代码,我总是得到错误10049.

怪THI NG是,如果我取消注释的代码行findPairedService功能,我只是做

 _SOCKET_ADDRESS address; 
    memset (&address, 0, sizeof(address)); 
    if(blue->findPairedService(&blue->getDefaultGUID4XVR(), &address)){ 

它成功地连接到手机....

出了什么问题?

谢谢!

回答

0

根据文档,WSALookupServiceEnd“终止查询并清理上下文。”据推测,这包括删除/覆盖它返回的SOCKADDR结构中的值,以后在连接调用中使用。因此,只需创建自己的内存位来存储结构,将返回的字节复制到它中,并且所有应该都可以。

顺便说一句,你知道做Windows会自动做任何必要的SDP查找;当connect()SOCKADDR_BTH.serviceClassId字段中被赋予服务类别ID(UUID/Guid)时,它将执行SDP查找并找到RFCOMM端口号 - 并且不再需要执行任何这些操作。 :-)

+0

hi..i阅读关于WSALookupServiceEnd。奇怪的是,如果我在findPairedService()的末尾调用connect,即使wsalookupserviceend已经被调用,它也可以工作。我也尝试使用SOCKADDR_BTH设置serviceClassId到我的UUID,但我得到错误10022 .. – hara 2010-05-23 16:31:30